web-dev-qa-db-fra.com

BOOT_COMPLETED ne fonctionne pas Android

Tout d'abord, je sais que des centaines de questions de ce type ont été posées, mais je les vérifie toutes depuis un moment et je n'ai toujours pas trouvé de solution.

J'ai vu cette réponse dit que BOOT_COMPLETED n'est pas envoyé à l'application à moins que l'utilisateur ne lance d'abord votre application, après Android version 3.1). Mais certaines applications le font encore Je dois vraiment le gérer, sinon je suis également contre de faire quelque chose sans interaction de l'utilisateur.

Alors, voici mon AndroidManifest:

<manifest ... >

<!-- to be activated service on boot is completed -->
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission Android:name="Android.permission.WAKE_LOCK" />

<application ... >
    <!-- to receive data when boot completed -->
    <receiver
        Android:name="myPackage.BootReceiver"
        Android:enabled="true"
        Android:exported="true"
        Android:permission="Android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
</application>

</manifest>

Merci d'avance.

Edit: Il n'y a pas grand-chose à voir dans mon émission de radio, mais à qui l'exige ici:

package myPackage
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Utils.LogI("BootReceiver", "BootReceiver received!");
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        // Do my stuff
    }
}
}
38
yahya

Cette chose ci-dessous a fonctionné pour moi

AndroidManifest.xml

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

<application>    

    <receiver Android:name=".BootCompletedReceiver" >
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED" />
            <action Android:name="Android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

    <service Android:name="NotifyingDailyService" >
    </service>

BootCompletedReceiver.class

public class BootCompletedReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    // TODO Auto-generated method stub
    Log.w("boot_broadcast_poc", "starting service...");
    context.startService(new Intent(context, NotifyingDailyService.class));
}

}

Service.class

 public class NotifyingDailyService extends Service {

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent pIntent, int flags, int startId) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "NotifyingDailyService", Toast.LENGTH_LONG).show();
    Log.i("com.example.bootbroadcastpoc","NotifyingDailyService");

    return super.onStartCommand(pIntent, flags, startId);
}
}
66
Piyush

C'est une question ancienne et basique, mais beaucoup de développeurs Android sont encore confus au sujet de ce problème, car , ils ne prennent pas le temps de lire les documents avec attention

J'ai vu quelqu'un partager des liens et dire que:  "Cela ne fonctionnera plus" , c'est totalement faux et mal compris .

À propos de cette préoccupation: "J'ai vu cette réponse dire que BOOT_COMPLETED n'est pas envoyé à l'application à moins que l'utilisateur lance votre application d'abord, après Android version 3.1", veuillez lire ces lignes (à partir de documents officiels: https://developer.Android.com/about/versions/Android-3.1.html#launchcontrols ) pour bien comprendre:

  • Notez que l'état arrêté d'une application n'est pas identique à l'état de l'état arrêté . Le système gère ces deux états arrêtés séparément.

  • Les applications sont à l'état arrêté lorsqu'elles sont installées pour la première fois mais ne sont pas encore lancées et qu'elles sont arrêtées manuellement par l'utilisateur (in Gérer les applications ). (elles signifient forcer l'arrêt un app)

enter image description here

  1. Cela signifie qu'un utilisateur doit lancer l'application au moins une fois après l'installation pour activer l'application, l'application peut alors recevoir implicitement émissions à partir du système d'exploitation comme d'habitude. ( Juste un lancement unique! )

  2. "Est-ce qu'une application qui est installée et qui ne s'ouvre jamais même une seule fois ?", ouais, c'est spam et escroqueries des applications, cette technique permet à l'utilisateur d'éviter cela!

DE PLUS, JUSQU'À MAINTENANT (Android Oreo 8.0) , lorsque Android limite l'enregistrement des émissions implicites sur Manifest ( https: // developer .Android.com/about/versions/oreo/background.html # diffusions ), plusieurs diffusions sont toujours exemptées de ces limitations. Et BOOT_COMPLETED est le premier qu'ils mentionnent ! ( https://developer.Android.com/guide/components/broadcast-exceptions.html )

À propos, c'est la meilleure solution que j'ai trouvée pour cette question:

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

<receiver Android:name=".BootReceiver" Android:enabled="true" Android:exported="true">
            <intent-filter>
                <category Android:name="Android.intent.category.DEFAULT"/>
                <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
                <action Android:name="Android.intent.action.QUICKBOOT_POWERON"/>
                <!--For HTC devices-->
                <action Android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
            </intent-filter>
        </receiver>

Enfin, lisez attentivement le document et réfléchissez deux fois, codez une fois: 3 !

32

Le problème est avec l'appareil. Certains appareils n'autorisent que les applications internes à recevoir cette action (exemple: Android 5.1).

vous pouvez l'ajouter à votre filtre d'intention en tant que solution de contournement

action Android:name="Android.intent.action.USER_PRESENT"

Ceci est déclenché après le déverrouillage de l'appareil par l'utilisateur.

4
Gà Và Sói

certaines nouvelles tablettes et Android sont dotés d'une application de sécurité par défaut. Parfois, ces applications verrouillent votre mode de démarrage automatique. Un exemple de cette application sécurisée est le gestionnaire MyAsus. Vous pouvez donc ajouter "autoriser le démarrage automatique". "à vos applications

4
iman kazemayni

Et pour les appareils Htc add com.htc.intent.action.QUICKBOOT_POWERON

    <receiver Android:enabled="true" Android:name=".receivers.BootUpReceiver">
        <intent-filter>
            <category Android:name="Android.intent.category.DEFAULT" />
            <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            <action Android:name="Android.intent.action.QUICKBOOT_POWERON"/>
            <action Android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
         </intent-filter>
    </receiver>
4
Xar E Ahmer

Le problème que j'ai rencontré était que BOOT_COMPLETED et QUICKBOOT_POWERON ensemble ne déclenche pas toujours mon intention lorsque j’éteins l’alimentation de mon panneau Android 6.0.1.). Je cherche Internet depuis assez longtemps et trouve la solution en ajoutant QUICKBOOT_POWEROFF dans le fichier manifeste.

Voir également:

Le "démarrage rapide" de HTC ne diffuse pas l'intention de BOOT_COMPLETED ni ne supprime les intentions du gestionnaire d'alarmes

1
Willem Luijk

Pour contourner ce problème, vous devez créer un service NotificationListener.

si le périphérique est> = Build.VERSION_CODES.JELLY_BEAN_MR2 et ayant une option d'optimisation de la batterie comme dans les périphériques Huawei, vous devez demander l'autorisation NotificationListener et créer un service NotificationListener comme dans le code ci-dessous, vous obtiendrez le code BOOT_COMPLETED dans votre récepteur.

Destinataire du manifeste:

    <receiver
                Android:name=".TestRes"
                Android:enabled="true"
                Android:exported="true">
                <intent-filter Android:priority="1">
                    <category Android:name="Android.intent.category.DEFAULT"/>
                    <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
                    <action Android:name="Android.intent.action.QUICKBOOT_POWERON"/>
                    <action Android:name="Android.intent.action.USER_PRESENT"/>
                    <action Android:name="Android.intent.action.REBOOT"/>
                </intent-filter>
 </receiver>

1 créez un service NotificationListener:

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class DevAppNotificationListener extends NotificationListenerService {

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
//        super.onNotificationPosted(sbn);
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
   //     super.onNotificationRemoved(sbn);
    }


}

2 vérifiez si NotificationListener est accordé ou non:

static boolean CheckNotificationLisPermission(Context context)
    {

        return NotificationManagerCompat.getEnabledListenerPackages (context).contains(context.getApplicationContext().getPackageName());

    }

3 sinon, demandez l'autorisation de NotificationListener:

 Intent intent = new Intent("Android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
            context.startActivityForResult(intent, callBackResultIntent);
0
ahmadzuhair