Soll ich PendingIntent.getService() oder getBroadcast mit AlarmManager verwenden?

Lesezeit: 3 Minuten

Benutzer-Avatar
marlar

Meine App muss jeden Tag zu einer bestimmten Zeit einige Daten aus dem Internet abrufen. Also verwende ich einen AlarmManager, um die Aufgabe zu planen, und das funktioniert gut.

Aber wenn man sich verschiedene Beispiele ansieht, scheint es zwei Möglichkeiten zu geben, mit dem AlarmManager umzugehen, wenn es um die ausstehende Absicht geht.

Man benutzt PendingIntent.getBroadcast() einen Rundfunkempfänger anzurufen, wenn der Alarm losgeht, und in diesem Empfänger wird der Dienst gestartet, um die eigentliche Arbeit zu erledigen.

Ein weiterer Ansatz ist die Verwendung PendingIntent.getService() und rufen Sie den Service direkt an, wenn dieser Alarm losgeht.

Kann mir jemand den Unterschied zwischen den beiden Ansätzen erklären, damit ich entscheiden kann, auf welchen ich mich verlassen soll?

BEARBEITEN: Eine weitere Frage ist, wo das Wakelock bei der Verwendung von getService() abgerufen werden soll.

Wenn ich beispielsweise einen BroadcastReceiver verwende, habe ich die folgende Zeile in onReceive():

WakeReminderIntentService.acquireStaticLock(context);

Wie soll ich das Wakelock erwerben, wenn ich stattdessen den Dienst direkt anrufe wie:

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);

Sollte ich es stattdessen einfach innerhalb des Dienstes erwerben?

  • Es spielt wirklich keine Rolle, so oder so. Sie können IntentService oder Service oder einen lokalen oder globalen Broadcast verwenden. Sie sollten in der Lage sein, das gleiche in allen von ihnen zu tun.

    – IgorGanapolsky

    20. Mai 2016 um 15:54 Uhr

Benutzer-Avatar
Vineet Shukla

Man benutzt PendingIntent.getBroadcast() a anrufen broadcast receiver Wenn der Alarm losgeht und in diesem Empfänger der Dienst für die eigentliche Arbeit gestartet wird.

Es hat einen Schritt mehr beim Starten des Dienstes als

Ein weiterer Ansatz ist die Verwendung PendingIntent.getService() und rufen Sie den Service direkt an, wenn dieser Alarm losgeht.

Dann sollten Sie den zweiten Ansatz verwenden, da er Ihren Ausführungsschritt um einen Schritt reduziert.

  • “Dann sollten Sie den zweiten Ansatz verwenden, da er Ihren Ausführungsschritt um einen Schritt reduziert”: Wenn dies der einzige Unterschied ist, sicherlich ja. Aber ich habe mich gefragt, ob es einen subtileren Unterschied gibt, etwas, das sich auf die Leistung usw. auswirken könnte.

    – Mergel

    5. September 2011 um 13:39 Uhr

  • Man muss PendingIntent.getBroadcast(..) verwenden, um zu verhindern, dass der Dienst nicht gestartet wird. Das System hält eine Wecksperre für die onReceive()-Methode des Empfängers. Für den Dienst tut es das nicht. Stellen Sie also sicher, dass Sie PendingIntent.getBroadcast verwenden. sehen developer.android.com/reference/android/app/AlarmManager.html als Referenz.

    – TomerBu

    27. September 2016 um 13:30 Uhr


Benutzer-Avatar
schnatterer

Ich nehme an, Sie haben es selbst herausgefunden, als Sie Ihre Bearbeitung gelesen haben: Wenn Sie sicherstellen möchten, dass Ihr Dienst bei der Verwendung gestartet wird AlarmManagernehmen Sie besser den Umweg, zuerst an einen Empfänger zu senden und dort einen Wakelock zu erwerben.
Andernfalls ist es möglich, dass das Telefon in den Ruhezustand versetzt wird, bevor der angeforderte Dienst gestartet wird. Das ist, was die javadoc von AlarmManager sagt und ich las es auch in der Post von Google-Ingenieur.

Nun also zu Ihrer Bearbeitung: Wann soll die Sperre erworben werden? Der ganze Zweck der Verwendung des Empfängers besteht darin, die Sperre innerhalb des zu erwerben onReceive() Methode des Empfängers, da Android während der Ausführung dieser Methode nicht einschläft.

Ein Beispiel finden Sie in dieser Frage.

1049290cookie-checkSoll ich PendingIntent.getService() oder getBroadcast mit AlarmManager verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy