Essayer de démarrer un service au démarrage sur Android

J’ai essayé de démarrer un service lorsqu’un périphérique démarre sur Android, mais je n’arrive pas à le faire fonctionner. J’ai examiné un certain nombre de liens en ligne, mais aucun code ne fonctionne. Est-ce que j’oublie quelque chose?

AndroidManifest.xml

      

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"); } } 

Les autres réponses semblent bonnes, mais je pensais que je mettrais tout dans une réponse complète.

Vous avez besoin des éléments suivants dans votre fichier AndroidManifest.xml :

  1. Dans votre élément :

      
  2. Dans votre élément (veillez à utiliser un nom de classe qualifié complet [ou relatif] pour votre BroadcastReceiver ):

          

    (vous n’avez pas besoin de l’ android:enabled atsortingbuts android:enabled , exported , etc.: les parameters par défaut d’Android sont corrects)

    Dans MyBroadcastReceiver.java :

     package com.example; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent startServiceIntent = new Intent(context, MyService.class); context.startService(startServiceIntent); } } 

De la question initiale:

  • il n’est pas clair si l’élément était dans l’élément
  • il n’est pas clair si le nom de classe complet qualifié (ou relatif) pour le BroadcastReceiver été spécifié
  • il y avait une faute de frappe dans le

Comme info supplémentaire: BOOT_COMPLETE est envoyé aux applications avant que le stockage externe ne soit monté. 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 “boot completed”

Comment démarrer le service au démarrage du périphérique (application autorun, etc.)

Pour la première fois: 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 “fermé” 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 activité. Lorsque l’utilisateur l’exécute, l’application peut recevoir le message de diffusion BOOT_COMPLETE.

Pour la seconde: BOOT_COMPLETE est envoyé avant que le stockage externe ne soit monté. Si l’application est installée sur un stockage externe, elle ne recevra pas le message de diffusion BOOT_COMPLETE.

Dans ce cas, il existe deux solutions:

  1. Installez votre application sur le stockage interne
  2. Installez une autre petite application dans le stockage interne. Cette application reçoit BOOT_COMPLETE et exécute une seconde application sur un stockage externe.

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 du périphérique.


Dans Manifest.xml

Autorisation:

  

Enregistrez votre récepteur BOOT_COMPLETED:

      

Enregistrez votre service:

  

Dans le récepteur OnBoot.java:

 public class OnBoot extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Create Intent Intent serviceIntent = new Intent(context, YourCoolService.class); // Start service context.startService(serviceIntent); } } 

Pour HTC, vous devrez peut-être également append Manifest ce code si le périphérique n’accepte pas RECEIVE_BOOT_COMPLETED:

  

Receiver ressemble maintenant à ceci:

       

Comment tester BOOT_COMPLETED sans émulateur de redémarrage ou périphérique réel? C’est facile. Essaye ça:

 adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED 

Comment obtenir l’identifiant du périphérique? Obtenir la liste des appareils connectés avec des identifiants:

 adb devices 

adb dans ADT par défaut, vous pouvez trouver dans:

 adt-installation-dir/sdk/platform-tools 

Prendre plaisir! )

De même que

  

utiliser aussi,

  

Les appareils HTC ne semblent pas attraper BOOT_COMPLETED

notez qu’au début de la question, il y a une faute de frappe:

au lieu de :

un petit “_” et tous ces ennuis 🙂

J’ai découvert tout à l’heure que cela pourrait être dû à l’option de Fast Boot dans Settings > Power

Lorsque cette option est désactivée, mon application reçoit cette diffusion, mais pas autrement.

Par ailleurs, j’ai Android 2.3.3 sur HTC Incredible S

J’espère que cela aide.

Je pense que votre manifeste doit append:

  

Après avoir essayé toutes les réponses et astuces mentionnées, je trouve finalement que le code ne fonctionne pas dans mon téléphone. Certains téléphones Android tels que “Huawei Honor 3C Android 4.2.2 ” ont un menu Gestionnaire de statup dans leurs parameters et votre application doit être cochée dans la liste. 🙂

J’ai une étiquette supplémentaire , je ne sais pas si cela fait une différence.

       

Avez-vous essayé de joindre la clause if-clause "android.intent.action.BOOT_COMPLETED".equals(intent.getAction() , car le destinataire ne reçoit probablement cette intention que de toute façon?)

Référer ce lien 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

Avant de monter un stockage externe, BOOT_COMPLETE est envoyé. Si votre application est installée sur un stockage externe, elle ne recevra pas de message de diffusion BOOT_COMPLETE. Pour éviter cela, vous pouvez installer votre application dans le stockage interne. vous pouvez le faire simplement en ajoutant cette ligne dans menifest.xml

  

Certains appareils HTC peuvent activer une fonctionnalité de “démarrage rapide” qui ressemble plus à une mise en veille prolongée et non à un redémarrage réel et ne doivent donc pas donner le sens de BOOT_COMPLETE. Pour récupérer cela, vous pouvez append ce filtre d’intention dans votre récepteur:

      

Si vous utilisez Android Studio et que vous êtes très attaché à l’auto-complétion, je dois vous informer que j’utilise Android Studio v 1.1.0 et que j’utilise l’auto-complétion pour l’autorisation suivante

  

Et Android Studio a terminé RECEIVE_BOOT_COMPLETED en minuscule, comme receive_boot_completed et je n’arrêtais pas de tirer mes cheveux parce que j’avais déjà coché ma liste de contrôle pour les tâches à effectuer pour démarrer le service au démarrage. Je viens de confirmer à nouveau

Android Studio complète automatiquement cette autorisation en minuscule.

Comme l’a commenté @Damian, toutes les réponses dans ce fil le font mal. Le faire manuellement, comme cela, risque d’arrêter votre service au milieu du périphérique en veille. Vous devez d’abord obtenir un verrou de réveil. Heureusement, la bibliothèque de support nous donne une classe pour le faire:

 public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // This is the Intent to deliver to our service. Intent service = new Intent(context, SimpleWakefulService.class); // Start the service, keeping the device awake while it is launching. Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); startWakefulService(context, service); } } 

puis, dans votre service, assurez-vous de libérer le verrou de veille:

  @Override protected void onHandleIntent(Intent intent) { // At this point SimpleWakefulReceiver is still holding a wake lock // for us. We can do whatever we need to here and then tell it that // it can release the wakelock. ... Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime()); SimpleWakefulReceiver.completeWakefulIntent(intent); } 

N’oubliez pas d’append la permission WAKE_LOCK à votre mainfest:

   

C’est ce que j’ai fait

1. J’ai fait la classe Receiver

 public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //whatever you want to do on boot Intent serviceIntent = new Intent(context, YourService.class); context.startService(serviceIntent); } } 

2.dans le manifeste

         ... 

3.et après TOUS vous devez “définir” le récepteur dans votre MainActivity, il peut être à l’intérieur de onCreate

 ... final ComponentName onBootReceiver = new ComponentName(getApplication().getPackageName(), BootReceiver.class.getName()); if(getPackageManager().getComponentEnabledSetting(onBootReceiver) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) getPackageManager().setComponentEnabledSetting(onBootReceiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP); ... 

le dernier point que j’ai appris d’ApiDemos

En fait, je n’ai pas eu de problème il y a longtemps, et c’est vraiment très facile à réparer, vous ne faites rien de mal si vous configurez la permission "android.intent.action.BOOT_COMPLETED" et le filtre d’intention.

Sachez que si vous utilisez Android 4.X, vous devez exécuter le programme d’écoute avant de démarrer le service, c’est-à-dire que vous devez d’abord append une activité, une fois que votre récepteur de diffusion est actif, votre application doit fonctionner comme prévu. Cependant, sous 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é.

J’ai rencontré ce problème si je laisse le constructeur vide dans la classe du récepteur. Après la suppression, les méthodes vides de conructor onRreceive ont bien fonctionné.