web-dev-qa-db-fra.com

Démarrage du service à partir de BroadcastReceiver

J'ai une Service et une BroadcastReceiver dans ma demande, mais comment puis-je lancer le service directement à partir de la BroadcastReceiver? En utilisant

startService(new Intent(this, MyService.class));

ne fonctionne pas dans une BroadcastReceiver, des idées?

MODIFIER:

context.startService (..);

fonctionne, j'ai oublié la partie contexte

61
Samuel

N'oublie pas

context.startService(..);

100
Samuel

devrait être comme ça:

Intent i = new Intent(context, YourServiceName.class);
context.startService(i);

assurez-vous d'ajouter le service à manifest.xml

55
Zeev G

utilisez la context de la méthode onReceive de votre BroadcastReceiver pour démarrer votre composant de service.

@Override
public void onReceive(Context context, Intent intent) {
      Intent serviceIntent = new Intent(context, YourService.class);
      context.startService(serviceIntent);
}
8
Sachin K

Meilleur entrainement :

Lorsque vous créez une intention, en particulier à partir de BroadcastReceiver, ne prenez pas this as context . Prenez context.getApplicationContext() comme ci-dessous.

 Intent intent = new Intent(context.getApplicationContext(), classNAME);
context.getApplicationContext().startService(intent);
5
ARUN

Comme la méthode onReceive (Context, Intent) du destinataire s’exécute sur le thread principal, elle doit être exécutée et renvoyée rapidement. Si vous devez effectuer de longues tâches, veillez à créer des threads ou à démarrer des services d'arrière-plan, car le système peut supprimer l'ensemble du processus après le retour de onReceive (). Pour plus d'informations, voir Effet sur l'état du processus. Pour effectuer un travail de longue durée, nous vous recommandons:

Appelez goAsync () dans la méthode onReceive () de votre récepteur et transmettez BroadcastReceiver.PendingResult à un thread en arrière-plan. Cela garde la diffusion active après le retour de onReceive (). Cependant, même avec cette approche, le système s'attend à ce que la diffusion soit terminée très rapidement (moins de 10 secondes). Cela vous permet de déplacer le travail vers un autre thread pour éviter de perdre le fil principal . Planification d'un travail avec JobScheduler developer.Android.com

0
Hojjat Zohoori
 try {
        Intent intentService = new Intent(context, MyNewIntentService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intentService );
        } else {
            context.startService(intentService );
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
0
Peter