BroadcastReceiver ne reçoit pas de BOOT_COMPLETED
J'ai regardé ici pour des problèmes similaires, mais pour une raison quelconque, mon BroadcastReceiver ne se termine jamais recevoir le android.l'intention.d'action.BOOT_COMPLETED Intention.
Voici mon (relatif) d'Android.Fichier Manifeste:
<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 Ici est le Récepteur.
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
- Aveugle deviner votre récepteur n'est pas dans le paquet principal et il n'y a pas de package/mainpackage/BootReceiver.java mais, au lieu package/mainpackage/receivers/BootReceiver.java, c'est à dire le chemin vers le récepteur est mal.
- Merci, je n'avais pas pensé à vérifier que, mais pas de chance c'est certainement dans le package par défaut.
- Ce problème peut se produire lorsque le récepteur déclaration contient android:exportées="true" serait de créer de nouveaux processus ensemble pour le récepteur. Votre enregistreur (Log.i) serait d'imprimer les résultats dans une nouvelle console que vous ne remarquerez même pas sous android moniteur (Android Studio). Je voudrais vous recommandons de supprimer cette instruction, sauf si vous savez ce que cela signifie.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez émuler toutes les actions de diffusion en se connectant via la bad à l'appareil et ouvrir un shell.
Nous y voilà:
adb shell
ou sur linux/mac./adb shell
am broadcast -a android.intent.action.BOOT_COMPLETED
ou toute action que vous souhaitez feuIl y a un tas de nice commandes à venir avec la bad ou la commande adb shell. Il suffit de l'essayer
Ce qui concerne
Flo
edit: oh putain, je voulais que cette réponse est une réponse sur le "a dû se tourner téléphone on/off à chaque fois". désolé les gars
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.mypackage.name
. Sans restreindre la diffusion de votre application, votre appareil sera réellement redémarrer.Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED } java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=3566, uid=2000
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED
vous avez besoin de changer la bad à la racine:./adb root
et puisadb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p yourpackage.app
sera œuvres.Je poste ceci dans l'espoir qu'il sera utile à quelqu'un qui a tout essayé mais toujours impossible de le faire exécuter au démarrage après l'installation ou ça marchait avant et ne fonctionne plus.
Donc, en supposant que vous avez ajouté l'autorisation:
Et enregistré votre récepteur:
Et codé votre
BroadcastReceiver
:De départ avec Android 3.1 toutes les applications, lors de l'installation, sont placés dans un "arrêté" de l'état.(C'est le même état que l'application se termine en une fois que l'utilisateur de la force-arrêt de l'application à partir de l'application Paramètres.)
Alors que dans "arrêté" de l'état, l'application ne fonctionnera pas pour une raison quelconque, à l'exception d'un manuel de lancement d'une activité. (Ce qui signifie pas de
BroadcastRecevier
(ACTION_PACKAGE_INSTALLED
,BOOT_COMPLETED
etc. sera invoqué, quel que soit l'événement pour lequel ils ont enregistré, jusqu'à ce que l'utilisateur exécute l'application manuellement.)C'est une décision de conception par Google pour empêcher les logiciels malveillants d'applications. Google a plaidé pour que les utilisateurs doivent lancer une activité à partir de l'écran de lancement la première, avant que la demande peut faire beaucoup. La prévention
BOOT_COMPLETED
d'être livré jusqu'à ce que l'activité est lancé est une conséquence logique de cet argument.Une fois que l'utilisateur exécute toute activité dans votre application, vous recevez le BOOT_COMPLETED diffusion après tous les futurs bottes.
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/
FLAG_EXCLUDE_STOPPED_PACKAGES
de tous diffusion intentions." qui aboutit à la situation décrite dans votre réponse - toutefois - "Un service d'arrière-plan ou de l'application pouvez remplacer ce comportement en ajoutant laFLAG_INCLUDE_STOPPED_PACKAGES flag
de diffuser des intentions qui devrait être autorisé à activer arrêté applications." je suis encore à tester cela, cependant :p (prises à partir du lien que vous avez posté developer.android.com/about/versions/...)addFlags
sauf si vous avez commencé votre activité la première fois, donc ce n'est pas ignorer la nécessité du démarrage de l'application pour la première fois.adb install -r
?Si votre application installée sur externe de stockage(carte SD), vous ne recevrez jamais de Démarrage Complet de l'action. Donc, vous devez spécifier
android:installLocation="internalOnly"
dans lemanifest tag
.Votre
<uses-permission>
élément doit être immédiate d'un enfant de la<manifest>
élément, et votre exemple de code ci-dessus suggère qu'il ne l'est pas.Voici un exemple de projet en démontrant l'utilisation de
BOOT_COMPLETED
.S'avère que le récepteur n'était pas dans la balise de l'manifeste. Oups! Merci pour votre aide les gars! Le pire, sur le test c'est d'avoir à garder allumer ou d'éteindre le téléphone. 😛
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
Ce qui semble être l'avant-garde de thread pour ce problème, je voulais donc ajouter une solution pour mon C# collègues. Je me suis creusé le cerveau à essayer de comprendre ce que je faisais de mal, après avoir tout essayer ici, en vain. J'ai finalement comprendre ce qui n'allait pas, et elle diffère un peu de l'avis ici pour Mono C# développement. En gros, ça se résume à quelque chose que j'ai appris à la dure. Avec C# NE PAS MODIFIER AndroidManifest.xml manuellement!
Voir ce guide pour référence:
Xamarin: Travailler avec AndroidManifest.xml
Plus directe à ce problème, ici, est de savoir comment vous obtenez ce fait.
Tout d'abord, dans votre projet, propriétés, sous le Manifeste de l'Onglet, il y a une liste de case à cocher pour choisir les autorisations que vous souhaitez offrir, dont l'un est RECEIVE_BOOT_COMPLETED. Vérifier que pour fournir ces autorisations.
Deuxièmement, vous avez besoin de mettre les informations nécessaires sur votre BroacastReceiver classe.
La dernière partie de [IntentFilter()] traitant de priorité n'est pas obligatoire, il permet simplement d'autres priorité plus élevée choses se faire d'abord sur démarrage, et il est de bonne pratique si votre Application n'est pas une priorité élevée chose.
Comme vous le verrez dans l'article lié, à l'aide de ces balises dans votre code sera la cause de la AndroidManifest.xml fichier doit être créé au moment de la construction, avec tout ce que la façon dont il devrait être. Ce que j'ai constaté, c'est que lors de la modification du manifeste manuellement pour inclure le récepteur de balise, le système était à l'origine à la recherche de la classe d'un niveau trop profonde, jetant ainsi un ClassNotFound exception. Il essayait d'instancier [Namespace].[Namespace].[BroadcastReceiver] ce qui est faux. Et il était en train de faire que parce que le manuel manifeste modifications.
De toute façon, espérons que cette aide.
Aussi, une autre petite astuce avec la bad outil. Si vous souhaitez obtenir un plus facile de lire la version du journal, essayez ceci:
C:\Android\platform-tools\adb logcat >> C:\log.txt
Cela va vider le logcat pour un fichier texte que vous pouvez ouvrir et lire un peu plus facile que dans la fenêtre d'invite de commande. Fait couper et coller des choses un peu plus facile aussi.
Relevant de certains appareils fonctionnant sous Android Kitkat 4.4.4_r2/r1.
Il semble y avoir un bug sur Android qui font android.l'intention.d'action.BOOT_COMPLETED pas être diffusé.
Voir:
ÉCHEC de DÉMARRAGE de décision du Gestionnaire de Package Service de prêt
Dans la plupart des cas, ce n'est pas la réponse à vos problèmes (plus probablement parce que les autorisations etc), mais si vous exécutez Kitkat, alors vous pourriez avoir un coup d'oeil et voir si cela semble être le cas pour vous.
J'ai eu ce problème et android.l'intention.d'action.BOOT_COMPLETED ne serait tout simplement pas diffusé de temps en temps, il avait commencé à le monter!
sur l'ajout de
<category android:name="android.intent.category.HOME" />
à mon fichier de manifeste de résoudre mon problème et travaille.D'autres réponses ici déjà couvertes comment parfaitement la mise en œuvre du Récepteur de Radiodiffusion afin que ça va fonctionner, cependant, j'ai encore eu des problèmes de réception de la BOOT_COMPLETED Intention jusqu'à ce que j'ai réalisé que l'application a été fait de travailler lorsqu'il est démarré à partir du téléphone ou de l'émulateur en cliquant sur l'icône de l'application.
Chaque fois que je démarre mon application avec le debug/exécuter des commandes à partir d'Android Studio le BOOT_COMPLETED Intention de ne pas être livrés, sauf si l'application est ouverte et en cours d'exécution.
J'espère que cela peut aider quelqu'un qui, comme moi, avait du mal pendant des heures avec ce problème.
Par ailleurs, si quelqu'un a une explication pour ce comportement, je serais vraiment heureux de savoir plus à ce sujet.