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.