Réponses:
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 votre AndroidManifest.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 récepteur qui obtiendra l' action BOOT_COMPLETED et démarrer 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 fonctionner au démarrage du téléphone.
Intent.ACTION_BOOT_COMPLETED
au lieu de coder en dur la chaîne dans votre récepteur. Vous devez également utiliser le nouveau Intent(context, MySystemService.class)
constructeur lors de la création de l'intention.
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
sur la public class
ligne. Des idées?
Voici comment démarrer une activité après le redémarrage de l'appareil Android:
Insérez ce code dans votre AndroidManifest.xml
fichier, à l'intérieur de l' <application>
élément ( pas à l'intérieur de l' <activity>
élément):
<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 à celle android:name
spécifiée pour l' <receiver>
élément 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 démarre pas.
En outre, les valeurs android:enabled
, android:exported
et android:permission
dans l' <receiver>
étiquette ne semblent pas obligatoire. L'application reçoit l'événement sans ces valeurs. Voir l'exemple ici .
Application
? Peut-être à l'intérieur onCreate()
?
onReceive()
unBroadcastReceiver
Écoutez ACTION_BOOT_COMPLETE et faites ce dont vous avez besoin à partir de là. Il y a un extrait de code ici.
Mettre à jour:
Le lien d'origine sur la réponse est en baisse, donc sur la base des commentaires, il s'agit ici du code lié, car personne ne manquerait jamais le code lorsque les liens sont en baisse.
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 voulez pas modifier le code, pour lancer une application Android au démarrage: AutoStart - Pas de racine
La solution de Sean n'a pas fonctionné pour moi au départ (Android 4.2.2). J'ai dû ajouter une activité fictive au même projet Android et exécuter l'activité manuellement sur l'appareil au moins une fois. Ensuite, la solution de Sean a commencé à fonctionner et le BroadcastReceiver a été averti après les redémarrages ultérieurs.
Je voudrais ajouter un point dans cette question à laquelle je faisais face depuis quelques jours. J'ai essayé toutes les réponses mais celles-ci ne fonctionnaient pas pour moi. Si vous utilisez la version Android 5.1, veuillez modifier ces paramètres.
Si vous utilisez Android version 5.1, vous devez désélectionner (Restreindre au lancement) dans les paramètres de l'application.
paramètres> application> votre application> Restreindre au lancement (désélectionner)
Une autre approche consiste à utiliser android.intent.action.USER_PRESENT
plutôt android.intent.action.BOOT_COMPLETED
qu'à éviter les ralentissements pendant le processus de démarrage. Mais ce n'est que true
si l'utilisateur a activé l'écran de verrouillage - sinon cette intention n'est jamais diffusée.
Blog de référence - Le problème de l'intention ACTION_USER_PRESENT d'Android