J'ai essayé de démarrer un service lorsqu'un appareil démarre sur Android, mais je n'arrive pas à le faire fonctionner. J'ai regardé un certain nombre de liens en ligne, mais aucun code ne fonctionne. Suis-je en train d'oublier quelque chose?
AndroidManifest.xml
<receiver
android:name=".StartServiceAtBootReceiver"
android:enabled="true"
android:exported="false"
android:label="StartServiceAtBootReceiver" >
<intent-filter>
<action android:name="android.intent.action._BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.test.RunService"
android:enabled="true" />
BroadcastReceiver
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent serviceLauncher = new Intent(context, RunService.class);
context.startService(serviceLauncher);
Log.v("TEST", "Service loaded at start");
}
}
Réponses:
Les autres réponses semblent bonnes, mais je pensais que je résumerais tout en une réponse complète.
Vous avez besoin des éléments suivants dans votre
AndroidManifest.xml
dossier:Dans votre
<manifest>
élément:Dans votre
<application>
élément (assurez-vous d'utiliser un nom de classe [ou relatif] complet pour votreBroadcastReceiver
):(vous n'avez pas besoin
android:enabled
,exported
etc., les attributs: les valeurs par défaut Android sont corrects)Dans
MyBroadcastReceiver.java
:De la question d'origine:
<receiver>
élément était dans l'<application>
élémentBroadcastReceiver
été spécifié<intent-filter>
la source
Comme information supplémentaire: BOOT_COMPLETE est envoyé aux applications avant le montage du stockage externe. Donc, si l'application est installée sur un stockage externe, elle ne recevra pas de message de diffusion BOOT_COMPLETE.
Plus de détails ici dans la section Récepteurs de diffusion écoutant le "démarrage terminé"
la source
Comment démarrer le service au démarrage de l'appareil (application d'exécution automatique, etc.)
Pour commencer: depuis la version Android 3.1+, vous ne recevez pas BOOT_COMPLETE si l'utilisateur n'a jamais démarré votre application au moins une fois ou si l'utilisateur a "forcé la fermeture" de l'application. Cela a été fait pour empêcher les logiciels malveillants d'enregistrer automatiquement le service. Ce trou de sécurité a été fermé dans les nouvelles versions d'Android.
Solution:
Créez une application avec une activité. Lorsque l'utilisateur l'exécute une fois que l'application peut recevoir un message de diffusion BOOT_COMPLETE.
Pour le second: BOOT_COMPLETE est envoyé avant le montage du stockage externe. Si l'application est installée sur un stockage externe, elle ne recevra pas de message de diffusion BOOT_COMPLETE.
Dans ce cas, il existe deux solutions:
Si votre application est déjà installée dans le stockage interne, le code ci-dessous peut vous aider à comprendre comment démarrer le service au démarrage de l'appareil.
Dans Manifest.xml
Autorisation:
Enregistrez votre récepteur BOOT_COMPLETED:
Enregistrez votre service:
Dans le récepteur OnBoot.java:
Pour HTC, vous devrez peut-être également ajouter dans Manifest ce code si l'appareil n'attrape pas RECEIVE_BOOT_COMPLETED:
Le récepteur ressemble maintenant à ceci:
Comment tester BOOT_COMPLETED sans redémarrer l'émulateur ni l'appareil réel? C'est facile. Essaye ça:
Comment obtenir l'identifiant de l'appareil? Obtenez la liste des appareils connectés avec des identifiants:
adb dans ADT par défaut, vous pouvez trouver dans:
Prendre plaisir! )
la source
De même que
utiliser aussi,
Les appareils HTC ne semblent pas attraper BOOT_COMPLETED
la source
android.intent.action.QUICKBOOT_POWERON
n'est envoyé que lors de la restauration à partir du démarrage rapide. Cela signifie qu'il n'est pas nécessaire de faire des choses comme la réinitialisation des alarmes lors de la récupération à partir de Fast Boot car elles sont préservées. Par conséquent, il ne sera nécessaire d'utiliser que<action android:name="android.intent.action.QUICKBOOT_POWERON" />
si vous voulez faire quelque chose lorsque l'utilisateur pense que l'appareil a démarré.notez qu'au début de la question, il y a une faute de frappe:
<action android:name="android.intent.action._BOOT_COMPLETED"/>
au lieu de :
<action android:name="android.intent.action.BOOT_COMPLETED"/>
un petit "_" et tous ces ennuis :)
la source
Je viens de découvrir que cela pourrait être dû à l'
Fast Boot
option dansSettings
>Power
Lorsque cette option est désactivée, mon application reçoit cette diffusion, mais pas autrement.
D'ailleurs, je
Android 2.3.3
leHTC Incredible S
.J'espère que ça aide.
la source
Je pense que votre manifeste doit ajouter:
la source
Après avoir essayé toutes les réponses et astuces mentionnées, je trouve enfin pourquoi le code ne fonctionne pas sur mon téléphone. Certains téléphones Android comme «Huawei Honor 3C Android 4.2.2 » ont un menu Statup Manager dans leurs paramètres et votre application doit être cochée dans la liste. :)
la source
J'ai une
<category>
étiquette supplémentaire , je ne sais pas si cela fait une différence.Avez-vous essayé de supprimer la clause if
"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()
, car le destinataire ne reçoit probablement cette intention de toute façon?la source
Refer This Link http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Procédure pas à pas pour utiliser le démarrage sur le service
la source
Avant de monter le stockage externe, BOOT_COMPLETE est envoyé execute.si votre application est installée sur un stockage externe, elle ne recevra pas le message de diffusion BOOT_COMPLETE. Pour éviter cela, vous pouvez installer votre application dans le stockage interne. vous pouvez le faire en ajoutant simplement cette ligne dans menifest.xml
Certains appareils HTC peuvent activer une fonction de «démarrage rapide» qui ressemble plus à une mise en veille prolongée et non à un véritable redémarrage et ne devrait donc pas donner l'intention BOOT_COMPLETE. Pour récupérer cela, vous pouvez ajouter ce filtre d'intention à l'intérieur de votre récepteur:
la source
C'est ce que j'ai fait
1. J'ai fait la classe Receiver
2. dans le manifeste
3. et après TOUT ce dont vous avez besoin pour "régler" le récepteur dans votre MainActivity, il peut être à l'intérieur du onCreate
la dernière étape que j'ai apprise d'ApiDemos
la source
Si vous utilisez Android Studio et que vous aimez beaucoup la saisie semi-automatique, je dois vous informer que j'utilise Android Studio v 1.1.0 et j'ai utilisé la saisie semi-automatique pour l'autorisation suivante
Et Android Studio a complété automatiquement
RECEIVE_BOOT_COMPLETED
tout en minuscules commereceive_boot_completed
et j'ai continué à m'arracher les cheveux parce que j'avais déjà coché ma liste de contrôle pour les choses à faire pour démarrer le service au démarrage. Je viens de confirmer à nouveaula source
Comme l'a commenté @Damian, toutes les réponses de ce fil le font mal. Si vous le faites manuellement comme cela, vous risquez que votre service soit arrêté au milieu de l'appareil en veille. Vous devez d'abord obtenir un verrouillage de réveil. Heureusement, la bibliothèque de support nous donne une classe pour ce faire:
puis, dans votre Service, assurez-vous de libérer le verrouillage de réveil:
N'oubliez pas d'ajouter la permission WAKE_LOCK à votre mainfest:
la source
onNewIntent()
? Ou vous pouvez regarder la source d'IntentService et voir ce que vous devez faire pour que votre service le fasse correspondre ...En fait, j'ai eu ce problème il n'y a pas longtemps, et c'est vraiment très facile à résoudre, vous ne faites rien de mal si vous configurez l'
"android.intent.action.BOOT_COMPLETED"
autorisation et le filtre d'intention.Sachez que si vous sur Android 4.X, vous devez exécuter l'écouteur de diffusion avant de démarrer le service au démarrage, cela signifie que vous devez d'abord ajouter une activité, une fois votre récepteur de diffusion en cours d'exécution, votre application devrait fonctionner comme prévu, Cependant, sur Android 4.X, je n'ai pas trouvé de moyen de démarrer le service au démarrage sans aucune activité, je pense que Google l'a fait pour des raisons de sécurité.
la source
J'ai fait face à ce problème si je laisse le constructeur vide dans la classe récepteur. Après la suppression du constructeur vide, les méthos de réception ont commencé à fonctionner correctement.
la source