J'ai essayé d'utiliser l'exemple de code dans this link mais il semble obsolète et cela n'a pas fonctionné. Alors, quels changements dois-je apporter et dans quels fichiers pour que mon application démarre automatiquement lorsque Android a fini de démarrer?
Tout d'abord, vous avez besoin de l'autorisation dans votre AndroidManifest.xml
:
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
De plus, dans votreAndroidManifest.xml
, définissez votre service et écoutez l'action 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>
Ensuite, vous devez définir le destinataire qui obtiendra l'action BOOT_COMPLETED et démarrera votre service.
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);
}
}
}
Et maintenant, votre service devrait être lancé au démarrage du téléphone.
Voici comment faire en sorte qu'une activité commence à s'exécuter après le redémarrage du périphérique Android:
Insérez ce code dans votre fichier AndroidManifest.xml
, dans l'élément <application>
(not dans l'élément <activity>
):
<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>
Créez ensuite une nouvelle classe yourActivityRunOnStartup
(correspondant au Android:name
spécifié pour l'élément <receiver>
dans le manifeste):
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);
}
}
}
Remarque: L'appel i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
est important car l'activité est lancée à partir d'un contexte extérieur à l'activité. Sans cela, l'activité ne commencera pas.
De plus, les valeurs Android:enabled
, Android:exported
et Android:permission
dans la balise <receiver>
ne semblent pas obligatoires. L'application reçoit l'événement sans ces valeurs. Voir l'exemple ici .
Écoutez les (ACTION_BOOT_COMPLETE } et faites ce que vous devez à partir de là. Il y a un extrait de code ici.
Mettre à jour:
Le lien original sur la réponse est en panne, donc, basé sur les commentaires, il s'agit ici d'un code lié, car personne ne manquerait jamais le code lorsque les liens sont en panne.
Dans AndroidManifest.xml (partie application):
<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);
}
}
De plus, vous pouvez utiliser une application comme AutoStart si vous ne souhaitez pas modifier le code, pour lancer une application Android au démarrage: AutoStart - No root
La solution de Sean ne fonctionnait pas pour moi initialement (Android 4.2.2). J'ai dû ajouter une activité fictive au même projet Android et l'exécuter manuellement sur le périphérique au moins une fois. Ensuite, la solution de Sean a commencé à fonctionner et le BroadcastReceiver a été averti après des redémarrages ultérieurs.
Une autre approche consiste à utiliser Android.intent.action.USER_PRESENT
au lieu de Android.intent.action.BOOT_COMPLETED
pour éviter les ralentissements pendant le processus de démarrage. Mais ceci n’est que true
si l’utilisateur a activé le verrouillage de l’écran - sinon cette intention n’est jamais diffusée.
Blog de référence - Le problème avec l’intention d’ACTION_USER_PRESENT d’Android
Je voudrais ajouter un point à cette question à laquelle je suis confronté pendant quelques jours. J'ai essayé toutes les réponses mais celles-ci ne fonctionnaient pas pour moi. Si vous utilisez Android version 5.1, veuillez modifier ces paramètres.
Si vous utilisez Android version 5.1, vous devez alors désélectionner (Limiter au lancement) dans les paramètres de l'application.
paramètres> application> votre application> Restreindre au lancement (désélectionner)