web-dev-qa-db-fra.com

startActivity () de BroadcastReceiver

J'essaie de démarrer automatiquement mon application Nightclock sur la charge en utilisant le BroadcastReceiver suivant implémenté dans la méthode onPause ():

BroadcastReceiver test = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        unregisterReceiver(this);
        Intent i = new Intent(context, NightClock.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);   
    }           
};
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED));

La méthode onReceive () est déclenchée lorsque le câble USB est branché, mais l'activité ne démarre pas. Cependant, le journal montre ceci:

I/ActivityManager(   79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock }

Des idées pour lesquelles le journal indique que l'activité a commencé, mais rien ne se passe?

37
Gubbel

Si votre objectif est que vous souhaitiez que NightClock soit lancé chaque fois qu'une diffusion ACTION_POWER_CONNECTED Est envoyée, votre approche de l'utilisation d'un BroadcastReceiver est correcte. Cependant, ne l'enregistrez pas à partir d'une activité. Enregistrez-le plutôt dans le manifeste:

<receiver Android:name=".OnPowerReceiver">
        <intent-filter>
                <action Android:name="Android.intent.action.ACTION_POWER_CONNECTED" />
        </intent-filter>
</receiver>

Ensuite, ayez votre BroadcastReceiver en tant que public Java (ici nommée OnPowerReceiver, bien que vous puissiez l'appeler comme vous voulez), et faites-la appeler startActivity().

Gardez à l'esprit que les utilisateurs ne veulent probablement pas que vous le fassiez. Il existe de nombreux autres cas pour connecter un téléphone à l'alimentation en plus de démarrer une "horloge de nuit". Je vous suggère humblement de simplement laisser les utilisateurs démarrer votre activité via l'écran d'accueil.

19
CommonsWare

Vous avez passé le contexte en tant que paramètre à la méthode onRecieve (), alors utilisez simplement:

 @Override
public void onReceive(Context context, Intent intent) {
    //start activity
    Intent i = new Intent();
    i.setClassName("com.test", "com.test.MainActivity");
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
}

Cela fonctionne, bien sûr, vous devez changer le nom du package et de la classe d'activité en votre propre nom.

57
Sathish