Como Utilizar BroadcastReceiver para Iniciar uma Aplicação

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.