Meine App verwendet dieses klassische Muster zum Planen periodischer Aufgaben:
AlarmManager
(via setExactAndAllowWhileIdle()
, da er auch in Doze ausgeht) IntentService
von onReceive()
via WakefulBroadcastReceiver.startWakefulService()
onHandleIntent()
und rufen Sie WakefulBroadcastReceiver.completeWakefulIntent()
auf, wenn Sie fertig sind. Heute habe ich die targetSdkVersion auf 26 aktualisiert und sah sich mit der schrecklichen Tatsache konfrontiert, dass WakefulBroadcastReceiver
veraltet ist .
Ich habe API-Dokumente sofort gelesen und folgendes gefunden:
Ab Android O machen Hintergrundprüfungseinschränkungen diese Klasse ungültig länger allgemein nützlich. (Es ist im Allgemeinen nicht sicher, einen Dienst zu starten vom Empfang einer Sendung, weil Sie keine Garantien haben dass deine App an dieser Stelle im Vordergrund steht und somit erlaubt ist tun Sie das.) Stattdessen sollten Entwickler
android.app.job.JobScheduler
verwenden Planen Sie einen Job, und dies erfordert nicht, dass die App eine Wake hält währenddessen verriegeln (das System wird dafür sorgen, dass eine Wecksperre gehalten wird) für den Job).
Das ist irgendwie verwirrend für mich, ich verstehe nicht wirklich, was der Zweck von AlarmManager.setExactAndAllowWhileIdle()
ist, ohne das Gerät weiter wach zu halten.
Wie ich sehe, kann ich keine genaue Zeit einstellen, um einen Job mit JobScheduler
auszuführen, nur Bedingungen (wie Netzwerktyp oder Ladezustand), also habe ich keine Ahnung, was ich hier tun soll.
Ich dachte an entweder
Verwenden von AlarmManager
und JobScheduler
zusammen
Setzen Sie einen Alarm (mit setExactAndAllowWhileIdle()
) und starten Sie einen Job (via JobScheduler
) sofort von onReceive()
. Da JobScheduler
eine WakeLock
liefert, wird WakefulBroadcastReceiver
nicht benötigt.
(macht das Sinn?)
oder
WakefulBroadcastReceiver
, obwohl sie veraltet ist. Ich würde wirklich jeden Rat in dieser Angelegenheit schätzen.
Tags und Links android android-jobscheduler