Starten des Dienstes von BroadcastReceiver


70

Ich habe ein Serviceund BroadcastReceiverin meiner Anwendung, aber wie starte ich den Dienst direkt von der BroadcastReceiver? Verwenden von

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

funktioniert nicht in a BroadcastReceiver, irgendwelche ideen?

BEARBEITEN:

context.startService (..);

funktioniert, ich habe den Kontextteil vergessen

Antworten:



60

sollte so sein:

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

Stellen Sie sicher, dass Sie den Dienst zu manifest.xml hinzufügen


Typisches Manifestelement (unter <Anwendung>, auf derselben 'Ebene' wie <Aktivität>): <Empfänger android: name = ". YourServiceName"> </ empfänger>
Art Swri

@ArtSwri sollte <service android: name = ". YourServiceName"> </ service> kein Empfänger sein.
Rahul

11

Verwenden Sie die Methode contextfrom onReceiveIhres BroadcastReceiver , um Ihre Dienstkomponente zu starten.

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

Endlich jemand, der erwähnen möchte, was "Kontext" ist. Vielen Dank.
Virus721

6

Beste Übung :

BroadcastReceiverNehmen Sie dies nicht als Kontext, während Sie eine Absicht erstellen, insbesondere wenn Sie damit beginnen . Nehmen Sie context.getApplicationContext()wie unten

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

1
Ja. Wir sollten context.getApplicationContext () übergeben, sonst stürzt die App ab
Vijay

1
Möchten Sie erwähnen, warum bitte?
Virus721

1
Grund dafür: Kontextregistrierte Empfänger empfangen Sendungen, solange ihr Registrierungskontext gültig ist. Wenn Sie sich beispielsweise in einem Aktivitätskontext registrieren, erhalten Sie Broadcasts, solange die Aktivität nicht zerstört wird. Wenn Sie sich im Anwendungskontext registrieren, erhalten Sie Broadcasts, solange die App ausgeführt wird.
ARUN

Stürzt immer noch für mich ab.
zezba9000

1
 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

Da die onReceive-Methode (Context, Intent) eines Empfängers im Hauptthread ausgeführt wird, sollte sie schnell ausgeführt und zurückgegeben werden. Wenn Sie lange laufende Arbeiten ausführen müssen, sollten Sie vorsichtig sein, wenn Sie Threads erzeugen oder Hintergrunddienste starten, da das System den gesamten Prozess nach der Rückkehr von onReceive () abbrechen kann. Weitere Informationen finden Sie unter Auswirkung auf den Prozessstatus. Um lange laufende Arbeiten auszuführen, empfehlen wir:

Rufen Sie goAsync () in der onReceive () -Methode Ihres Empfängers auf und übergeben Sie BroadcastReceiver.PendingResult an einen Hintergrundthread. Dadurch bleibt die Sendung nach der Rückkehr von onReceive () aktiv. Selbst mit diesem Ansatz erwartet das System jedoch, dass Sie die Übertragung sehr schnell (unter 10 Sekunden) beenden. Sie können die Arbeit auf einen anderen Thread verschieben, um Störungen des Hauptfadens zu vermeiden. Planen eines Jobs mit JobScheduler developer.android.com

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.