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
N'oublie pas
context.startService(..);
devrait être comme ça:
Intent i = new Intent(context, YourServiceName.class);
context.startService(i);
assurez-vous d'ajouter le service à manifest.xml
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);
}
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);
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
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();
}