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

Samuel
quelle

Antworten:

107

Vergiss nicht

context.startService(..);

Samuel
quelle
2
Makellose Antwort. Habe es mit sehr wenig Schwierigkeiten beim Lesen behoben.
Grepsedawk
1
Überprüfen Sie auch diesen Link groups.google.com/forum/#!topic/android-developers/WVoO8kQCFF0 context.startService (neue Absicht (MusicService.ACTION_PAUSE, null, context, MusicService.class));
cwhsu
2
das war sehr hilfreich.
Midiwriter
Vielen Dank für die Rettung ... :)
G Droide
Was soll "Kontext" sein?
Virus721
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

Zeev G.
quelle
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);
}
Sachin K.
quelle
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);
ARUN
quelle
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();
    }
Peter
quelle
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

Hojjat Zohoori
quelle