Boot Android terminé non reçu lorsque l'application est fermée
je suis conscient que cette question a été posée beaucoup sur le site, cependant, je ne semble pas pouvoir trouver une solution. Mon récepteur BOOT_COMPLETED n'est pas appelé lorsque l'application n'est pas en cours d'exécution.
manifeste:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.startuptest"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="internalOnly">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.startuptest.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.example.startuptest.StartUpBootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
StartUpBootReceiver:
public class StartUpBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("startuptest", "StartUpBootReceiver " + intent.getAction());
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
}
}
}
si l'application est en cours d'exécution et je simule un appel avec
adb shell
am broadcast -a android.intent.action.BOOT_COMPLETED
L'événement est reçu correctement, cependant, si l' l'événement n'est pas reçu, pas plus qu'il n'est reçu au démarrage.
j'ai installé l'application puis je l'ai lancée à quelques reprises pour m'assurer qu'elle est enregistrée. Je suis perdue sur ce coup, donc tout conseil serait grandement apprécié.
Edit: je peux voir dans les logs que toutes les autres applications fermées (Youtube, FileObserver, etc) reçoivent l'événement boot_completed, mais pas le mien.
8 réponses
je démarre mon application quand le BOOT_COMPLETE, donc je sais que ça marche. J'ajoute Log.d
ça ne se voit pas. J'ajoute Toast
il montre. De petites différences manifestes.xml
<receiver android:name="com.example.startuptest.StartUpBootReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
commençant par Android 3.1 toutes les applications, lors de l'installation, sont placées dans un " état arrêté ".(C'est le même état que l'application se termine dans après la force de l'utilisateur-arrête l'application de L'application de paramètres.)
pendant que dans l'état" arrêté", l'application ne fonctionnera pas pour n'importe quelle raison , sauf par un lancement manuel d'un activité. (C'est-à-dire non BroadcastReceviers
( ACTION_PACKAGE_INSTALLED
, BOOT_COMPLETED
etc.) sera invoquée, quel que soit l'événement pour lequel ils ont enregistré jusqu'à ce que l'utilisateur exécute l'application manuellement .)
C'est un anti-malware déplacer par Google. Google a préconisé que les utilisateurs devraient lancer une activité à partir du lanceur d'abord, avant que cette application peut aller faire beaucoup. Empêcher BOOT_COMPLETED
d'être livré jusqu'à ce que l'activité est lancée est une logique conséquence de cet argument.
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 /
chaque réponse ici Ajouter un petit morceau d'information, voici donc le résumé de tout:
pour être sûr que vous recevrez le BOOT_COMPLETED assurez-vous que vous faites ce qui suit:
-
ajoutez votre récepteur au manifeste (n'oubliez pas les drapeaux ):
<receiver android:name="com.yourpacakge.BootReceiver" android:exported="true" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver>
-
ajouter autorisation:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
-
après avoir installé votre application, il doit être déjeuner au moins une fois, manuellement par l'utilisateur, afin de recevoir L'événement complet de démarrage.( plus de détails )
se débattait avec le même problème, la raison est que vous utilisez Log.d pour suivre votre application dans logcat, malheureusement quand vous redémarrez votre téléphone l'application reçoit le BOOT_Complete mais vous ne pouvez pas le voir parce qu'il ne se connecte pas à logcat.
essayez de faire un Toast
avec un texte au lieu de Log.d
pour vous assurer que BOOT_COMPLETED est ou n'est pas reçu.
espérons que cette Aide.
Voici une C# version les gars si vous le souhaitez. Mes tests montrent qu'il fonctionne de façon très parfaitement, et le démarrage est assez rapide. Bien que ne notez que l'ajouter à la fois dans C# et dans AndroidManifest.xml casse(pour moi au moins).
j'ai aussi ajouté quelques exemples sympas et utiles que j'aurais aimé découvrir de quelqu'un au lieu de l'apprendre moi-même en lisant les documentaires et tel.
[BroadcastReceiver(Enabled = true, Exported = true, DirectBootAware = true, Name = "com.nevaran.startup.StartUpBootReceiver")]
[IntentFilter(new string[] {
Intent.ActionBootCompleted
, Intent.ActionLockedBootCompleted
, Intent.ActionMyPackageReplaced
, Intent.ActionUserInitialize
, "android.intent.action.QUICKBOOT_POWERON"
, "com.htc.intent.action.QUICKBOOT_POWERON"
})]
public class BootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if( intent.Action.Equals(Intent.ActionBootCompleted)
|| intent.Action.Equals(Intent.ActionLockedBootCompleted)
|| intent.Action.Equals(Intent.ActionUserInitialize)
|| intent.Action.Equals("android.intent.action.QUICKBOOT_POWERON")
|| intent.Action.Equals("com.htc.intent.action.QUICKBOOT_POWERON")
)
{
//run code here only if its started by the chosen actions
}
//some code that doesnt care about which action is triggered by
}
}
si vous voulez connaître la raison réelle derrière pourquoi BOOT_COMPLETE ne fonctionne pas ou ne reçoit pas. Je vous suggère d'aller sur le site officiel de développement Android. Ils ont expliqué avec la solution exacte.
pour résoudre ce problème, vous pouvez utiliser firebaseJobDispatcher pour invoquer automatiquement , firebaseJobDispatcher aura le code pour réagir à vos services, oui après un certain temps les services peuvent s'arrêter par OS, mais votre firebaseJobDispatcher réactivera vos services à nouveau. FirebaseJobDispatcher a beaucoup de propriétés d'où vous pouvez définir la portée de ceci;
comment ça marche, pour plus de détails https://github.com/firebase/firebase-jobdispatcher-android
fondamentalement, vous avez besoin android:enabled="true" android:exportée="true" drapeaux dans manifeste pour recevoir l'émission.
<receiver android:name=".bootReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>