Respostas:
Primeiro, você precisa da permissão no seu AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Além disso, AndroidManifest.xml
defina seu serviço e ouça a ação BOOT_COMPLETED :
<service android:name=".MyService" android:label="My Service">
<intent-filter>
<action android:name="com.myapp.MyService" />
</intent-filter>
</service>
<receiver
android:name=".receiver.StartMyServiceAtBootReceiver"
android:label="StartMyServiceAtBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Em seguida, você precisa definir o receptor que obterá a ação BOOT_COMPLETED e iniciará o serviço.
public class StartMyServiceAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent serviceIntent = new Intent(context, MyService.class);
context.startService(serviceIntent);
}
}
}
E agora seu serviço deve estar em execução quando o telefone iniciar.
Intent.ACTION_BOOT_COMPLETED
vez de codificar a string no seu receptor. Além disso, deve usar o novo Intent(context, MySystemService.class)
construtor ao criar o Intent.
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
na public class
linha. Alguma ideia?
É assim que uma atividade começa a ser executada após a reinicialização do dispositivo Android:
Insira este código no seu AndroidManifest.xml
arquivo, dentro do <application>
elemento ( não dentro do <activity>
elemento):
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:enabled="true"
android:exported="true"
android:name="yourpackage.yourActivityRunOnStartup"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Em seguida, crie uma nova classe yourActivityRunOnStartup
(correspondendo à android:name
especificada para o <receiver>
elemento no manifesto):
package yourpackage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class yourActivityRunOnStartup extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
}
Nota: A chamada i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
é importante porque a atividade é iniciada a partir de um contexto fora da atividade. Sem isso, a atividade não será iniciada.
Além disso, os valores android:enabled
,android:exported
e android:permission
na <receiver>
tag não parecem obrigatório. O aplicativo recebe o evento sem esses valores. Veja o exemplo aqui .
Application
? Talvez dentro onCreate()
?
onReceive()
de umBroadcastReceiver
Ouça o ACTION_BOOT_COMPLETE e faça o que você precisa a partir daí. Há um trecho de código aqui.
Atualizar:
O link original na resposta está inoperante; portanto, com base nos comentários, aqui está o código vinculado, porque ninguém perderia o código quando os links estiverem inativos.
No AndroidManifest.xml (parte do aplicativo):
<receiver android:enabled="true" android:name=".BootUpReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
public class BootUpReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class); //MyActivity can be anything which you want to start on bootup...
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
Além disso, você pode usar um aplicativo como o AutoStart se não quiser modificar o código, para iniciar um aplicativo Android na inicialização: AutoStart - No root
A solução do Sean não funcionou para mim inicialmente (Android 4.2.2). Eu tive que adicionar uma atividade fictícia ao mesmo projeto Android e executá-la manualmente no dispositivo pelo menos uma vez. Em seguida, a solução do Sean começou a funcionar e o BroadcastReceiver foi notificado após as reinicializações subsequentes.
Eu gostaria de acrescentar um ponto nesta questão que eu estava enfrentando por alguns dias. Eu tentei todas as respostas, mas essas não estavam funcionando para mim. Se você estiver usando a versão Android 5.1, altere essas configurações.
Se você estiver usando a versão Android 5.1, precisará desmarcar (Restringir para iniciar) das configurações do aplicativo.
configurações> aplicativo> seu aplicativo> Restringir para iniciar (desmarcar)
Outra abordagem é usar em android.intent.action.USER_PRESENT
vez de android.intent.action.BOOT_COMPLETED
evitar lentidão durante o processo de inicialização. Mas isso é apenas true
se o usuário tiver ativado a tela de bloqueio - caso contrário, essa intenção nunca será transmitida.
Blog de referência - O problema com a intenção ACTION_USER_PRESENT do Android