web-dev-qa-db-fra.com

BroadcastReceiver ne recevant pas BOOT_COMPLETED

J'ai cherché des problèmes similaires dans les environs, mais pour une raison quelconque, mon BroadcastReceiver ne finit jamais par recevoir Android.intent.action.BOOT_COMPLETED Intent.

Voici mon fichier (relatif) Android.Manifest:

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>    
<receiver Android:name=".BootReceiver"
        Android:enabled="true"
        Android:exported="true"
        Android:label="BootReceiver">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"></action>

        </intent-filter>
    </receiver>

Et voici le récepteur actuel.

public class BootReceiver extends BroadcastReceiver {
private static final String TAG="BootReceiver";

@Override public void onReceive(Context context,Intent intent){
    try{
        context.startService(new Intent(context,ConnectivityListener.class));
        Log.i(TAG,"Starting Service ConnectivityListener");
    }catch(Exception e){
        Log.e(TAG,e.toString());
    }
}
}

Merci! Toute aide est grandement appréciée

63
apmeyers1987

Il s'avère que le destinataire n'était pas dans l'étiquette du manifeste. Oups! Merci pour votre aide les gars! Le pire dans ce test est de devoir éteindre et allumer le téléphone. : P

11
apmeyers1987

Vous pouvez émuler toutes les actions de diffusion en vous connectant via adb au périphérique et en ouvrant un shell de périphérique.

Et c'est parti:

  • ouvrir la console/le terminal et naviguer vers/les outils de la plateforme
  • tapez adb Shell ou sur linux/mac ./adb Shell
  • dans le type de shell am broadcast -a Android.intent.action.BOOT_COMPLETED ou quelle que soit l'action à déclencher

Un bon nombre de commandes Nice arrivent avec adb ou le shell adb. Juste l'essayer

Cordialement Flo

edit: oh zut, je voulais cette réponse comme une réponse sur le "devait allumer/éteindre le téléphone à chaque fois". Désolé les gars

164
fklappan

Je publie ce message dans l’espoir que cela sera utile à quelqu'un qui a tout essayé mais ne peut toujours pas le lancer au démarrage après l’installation ou qui fonctionnait auparavant et ne fonctionne plus.

Donc, en supposant que vous ayez ajouté la permission:

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />

Et enregistré votre récepteur:

<receiver Android:name="com.example.startuptest.StartUpBootReceiver">
    <intent-filter>
        <action Android:name="Android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Et codé votre BroadcastReceiver:

public class StartUpBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
            ...
        }
    }
}

À partir de Android 3.1 , toutes les applications, lors de l'installation, sont placées dans un " arrêté "state. (Il s'agit du même état dans lequel l'application se termine après que l'utilisateur l'ait forcée à arrêter l'application à partir de l'application Paramètres.)

Android stopped state

En état "arrêté", l'application ne s'exécutera pas pour une raison quelconque , sauf par le lancement manuel d'une activité. (Signification no BroadcastRecevier (ACTION_PACKAGE_INSTALLED, BOOT_COMPLETED etc. seront invoqués, quel que soit l'événement pour lequel ils se sont inscrits, jusqu'à ce que l'utilisateur exécute l'application manuellement .)

Il s'agit d'une décision de Google visant à empêcher les applications malveillantes. Google a préconisé que les utilisateurs lancent d'abord une activité à partir du programme de lancement, avant que cette application puisse faire beaucoup. Prévenir BOOT_COMPLETED de la livraison jusqu'au lancement de l'activité est une conséquence logique de cet argument.

Une fois qu'un utilisateur exécute une activité dans votre application, vous recevrez la diffusion BOOT_COMPLETED après tous les démarrages ultérieurs.

Plus de détails à ce sujet:
http://developer.Android.com/about/versions/Android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed-regression.html
http://devmaze.wordpress.com/2011/12/05/activating-applications/

140
Caner

Si votre application est installée sur une mémoire externe stockage (carte SD), vous ne recevrez jamais d’action Boot Complete. Donc, vous devez spécifier Android:installLocation="internalOnly" dans le manifest tag.

55
Sundeep1501

Votre <uses-permission> L'élément doit être un enfant immédiat du <manifest> élément, et votre code ci-dessus suggère que ce n’est pas le cas.

Voici un exemple de projet démontrant l'utilisation de BOOT_COMPLETED.

12
CommonsWare

Cela semble être le fil conducteur de ce problème et je voulais donc ajouter une solution à mes collègues C #. Je me suis creusé la tête en essayant de comprendre ce que je faisais mal après avoir tout essayé ici, en vain. J'ai enfin compris ce qui n'allait pas et il diffère un peu du conseil donné ici pour le développement C # Mono. En gros, cela revient à quelque chose que je viens d’apprendre à la dure. Avec C #, NE MODIFIEZ PAS AndroidManifest.xml manuellement!

Consultez ce guide pour référence: Xamarin: Travailler avec AndroidManifest.xml

Plus directement pour ce problème, voici comment procéder.

Tout d'abord, dans les propriétés de votre projet, sous l'onglet Manifest, une liste de cases à cocher vous permet de choisir les autorisations que vous souhaitez fournir, l'une d'elles étant RECEIVE_BOOT_COMPLETED. Vérifiez cela pour fournir ces autorisations.

Deuxièmement, vous devez mettre les balises appropriées sur votre classe BroacastReceiver.

[BroadcastReceiver]
[IntentFilter(new String[]{ Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)]
public class MyBootReceiver : BroadcastReceiver
{
   public override void OnReceive(Context context, Intent intent)
   {
      // Do your boot work here, set alarms, show toasts, whatever
   }
}

La dernière partie de [IntentFilter ()] traitant de la priorité n'est pas requise, elle laisse simplement d'autres tâches de priorité plus élevée être effectuée en premier au démarrage. C'est une bonne pratique si votre application n'est pas une priorité élevée.

Comme vous le verrez dans l'article lié, l'utilisation de ces balises dans votre code entraînera la création du fichier AndroidManifest.xml au moment de la construction, avec tout ce qu'il devrait être. Ce que j’ai constaté, c’est que lors de la modification manuelle du manifeste pour inclure la balise du destinataire, le système lui demandait de rechercher le niveau 1 de la classe trop profond, lançant ainsi une exception ClassNotFound. Il tentait d'instancier [Namespace]. [Namespace]. [BroadcastReceiver], ce qui était faux. Et il le faisait à cause des modifications du manifeste manuel.

Quoi qu'il en soit, espérons que cela aide.

En outre, une autre astuce rapide avec l'outil adb. Si vous souhaitez obtenir une version plus facile à lire du journal, essayez ceci:

C:\Android\plate-outils\adb logcat >> C:\log.txt

Cela va vider le logcat dans un fichier texte que vous pouvez ouvrir et lire un peu plus facilement que dans la fenêtre Invite de commandes. Facilite également les opérations de copier/coller.

5
Wanabrutbeer

Relatif à certains appareils fonctionnant Android KitKat 4.4.4_r2/r1.

Il semble y avoir un bogue dans Android qui rend Android.intent.action.BOOT_COMPLETED aucune diffusion.

Voir:
BOOT FAILURE rendant le service du gestionnaire de packages prêt

Dans la plupart des cas, ce n'est pas la réponse à vos problèmes (plus probablement à cause d'autorisations, etc.), mais si vous utilisez KitKat, vous pouvez jeter un coup d'œil et voir si cela semble être le cas pour vous.

J'ai eu ce problème et Android.intent.action.BOOT_COMPLETED ne serait tout simplement pas diffusé certaines des fois où il avait démarré!

1
JohnyTex

en ajoutant <category Android:name="Android.intent.category.HOME" /> ceci dans mon fichier manifeste résoud mon problème et fonctionne.

<receiver Android:name=".BroadCastRecieverClass">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            <category Android:name="Android.intent.category.HOME" />
        </intent-filter>
    </receiver>
0
Ayaz khan

D'autres réponses ici couvraient déjà la mise en œuvre parfaite du récepteur de radiodiffusion pour qu'il fonctionne correctement. Cependant, je rencontrais toujours des problèmes pour recevoir l'objectif BOOT_COMPLETED jusqu'à ce que je réalise que l'application fonctionnait réellement au démarrage du téléphone/de l'émulateur en appuyant sur l'icône de l'application. Chaque fois que je lance mon application avec les commandes de débogage/exécution de Android Studio, l’intention BOOT_COMPLETED n’est pas livrée, à moins que l’application ne soit ouverte et en cours d’exécution.

J'espère que cela pourra aider quelqu'un qui, comme moi, a lutté pendant des heures avec ce problème. De plus, si quelqu'un a une explication à ce comportement, je serais vraiment heureux d'en savoir plus à ce sujet.

0
c0rtexx