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.

21
demandé sur Hi I'm Frogatto 2013-06-21 05:33:34

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>
28
répondu Gina 2013-06-21 07:51:24

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.)

Android stopped state

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 /

82
répondu Caner 2013-11-08 10:08:40

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:

  1. 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>
    
  2. ajouter autorisation:

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

  3. 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 )

26
répondu Ilya Gazman 2017-05-23 12:34:21

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.

1
répondu Tarek K. Ajaj 2013-06-21 05:41:31

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
    }
}
1
répondu Nevaran 2018-07-23 11:58:53

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.

Android developer-BOOT_COMPLETE

0
répondu Sankar Behera 2017-08-30 16:47:25

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

0
répondu Abdul Rizwan 2018-10-12 09:13:10

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>
-1
répondu sgupta 2018-01-22 20:45:38