Recentemente necessitei incluir em um projeto Android a possibilidade de fazer a aplicação ser inicializada logo após o boot do dispositivo.
Para este post criei uma aplicação que faz uso da classe BroadcastReceiver para iniciar uma Activity toda vez que o dispositivo faz um boot.
No projeto criei duas classes Principal e IniciarApp.
A classe Principal é a Activity que será exibida logo após o boot do dispositivo. Utilizei a Activity padrão que é criada pelo Eclipse quando criamos um projeto Android, e exibe a mensagem Hello World, Principal!
A classe IniciarApp é a classe que é inicializada quando recebe a mensagem de Boot do sistema. (Listagem 1)
Listagem 1:
public class IniciarApp extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent i) {
// Exibe a Activity Principal após o boot
// do Android
Intent intent = new Intent(ctx, Principal.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(intent);
}
}
A classe IniciarApp estende a classe BroadcastReceiver. O método onReceive(Context, Intent) é chamado quando a aplicação recebe a mensagem de broadcast de boot do sistema. Neste método é declarada a intent que vai exibir a Activity Principal. Neste caso é necessário configurar o flag Intent.FLAG_ACTIVITY_NEW_TASK, para que a aplicação seja inicializada como uma nova tarefa na pilha do stack das Activities.
Para registrar um BroadcastReceiver podemos utilizar a API ou publicar o receiver no arquivo AndroidManifest.xml. Neste caso é mais simples publicar pelo arquivo AndroidManifest.xml. (Listagem 2)
Listagem 2:
<!-- Permissão necessária para receber a mensagem de boot completado -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<!-- Publicação do Broadcast -->
<receiver android:name=".IniciarApp">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<activity android:name=".Principal"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
No arquivo AndroidManifest.xml foi incluída a tag de permissão do usuário para receber a mensagem de boot completado, e também foi incluída a tag <receiver> que registra a classe IniciarApp como a classe que vai ser chamada quando a mensagem de boot do sistema for recebida.
Para testar, primeiro rode a aplicação uma vez no emulador para que o arquivo .apk da aplicação seja instalado, depois feche o emulador do Eclipse e abra novamente.
Quando o emulador finalizar o boot a Activity Principal será exibida apresentando a mensagem Hello World, Principal! Pronto agora a aplicação será inicializada após cada boot do sistema. Após os testes não esqueça de desinstalar a aplicação, senão toda vez que o emulador for inicializado vai apresentar a Activity Principal.
Uma observação importante é que esta utilização do BroadcastReceiver é muito particular e deve ser utilizada com cuidado, para que a experiência do usuário não seja prejudicada, porque desta forma a aplicação não segue o padrão das aplicações do Android.
A utilização recomendada para o BroadcastReceiver é trabalhar em conjunto com a classe Service e Notification. O ideal é que o BroadcastReceiver inicie um serviço em background e informe o usuário utilizando as mensagens de notificação do dispositivo.
Olá, Rosana!
ResponderExcluirE se ao invés de iniciar uma Activity eu quisesse iniciar um Service. Como faria?
Para iniciar um Service pode ser utilizado o mesmo procedimento descrito no blog. A única diferença é que na classe IniciarApp ao invés do Intent iniciar uma Activity iniciaria o Service.
ResponderExcluirO problema é só que essa Activity vai ser iniciada após qualquer broadcast.
ResponderExcluiré preciso filtrar o tipo de mensagem de broadcast...