1
resposta

Executar uma non-activity app em segundo plano

Prezados instrutores e colegas do forum, boa tarde!

Estou tentando criar uma aplicação que rode uma serviço em segundo plano (background). Inicialmente, para teste, apenas implementei um código responsável por vibrar o smartphone, de 5 em 5 segundos.

Orientado pela documentação oficial do Android (https://developer.android.com/guide/components/services), estendi a classe IntentService (sobrescrevendo o método onHandleIntent, conforme orientação no conteúdo do link), e criei uma outra classe estendendo android.app.Application. Contudo, me parece que o método onCreate da classe que estendi de android.app.Application nunca está sendo invocado. Veja meu simples código de teste, abaixo:

Classe que estende a Android Application class:

package br.com.exemplos.executarsegundoplano;

import android.app.Application;
import android.content.Intent;

public class Principal extends Application {
    private Principal() {
        super();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Intent serviceIntent = new Intent(Principal.this, Servico.class);
        startService(serviceIntent);
    }
}

Classe que estende a IntentService class:

package br.com.exemplos.executarsegundoplano;

import android.app.IntentService;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.VibrationEffect;
import android.os.Vibrator;

public class Servico extends IntentService {
    public Servico() {
        super("Servico");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        final Vibrator vibrador = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            vibrador.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
        else
            vibrador.vibrate(500);

        try {
            Thread.sleep(5000);
        }
        catch (InterruptedException excecao) {
            Thread.currentThread().interrupt();
        }
    }
}

Arquivo AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.exemplos.executarsegundoplano">

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:name="br.com.exemplos.executarsegundoplano.Principal"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.NoDisplay">

        <service
            android:enabled="true"
            android:name="br.com.exemplos.executarsegundoplano.Servico">
        </service>

    </application>

</manifest>

O que está faltando para que, após esta aplicação ser instalada no sistema operacional Android (e também quando o sistema operacional for reiniciado), a aplicação seja executada e o método onCreate da classe Principal (que estende Application) seja processado?

Desde já agradeço sua solicitude e presteza no atendimento deste!

1 resposta

Olá Cleizel, tudo bem ?

Para que seu service seja iniciado, a aplicação precisa ser aberta, pelo menos uma vez. Se for morta, todos os recursos serão levados junto com ela.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software