Android - AppWidgets, Alarmmanager und AsyncTask
-
16-09-2019 - |
Frage
Ich habe nicht viel Glück mit einer App-Widget mit AlarmManager
erzeugten Sendungen zu aktualisieren. Hier ist, was ich tun:
Initialisieren AlarmManager
auf AppWidgetProvider#onEnabled
AlarmManager alarms = (AlarmManager) context.getSystemService(
Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 60000, pendingIntent);
Ich sehe auch Rundfunkempfänger, die einfach für die Updates hört, die von der AlarmManager
gefeuert. Wenn Update ausgelöst wird Code ausgeführt AsyncTask
, die ein Netzwerk Anruf tätigt. Wenn die AsyncTask
abgeschlossen ist (onPostExecute
) verwendet es zuvor erhaltenen Instanz AppWidgetManager
das Widget (n) zu aktualisieren.
Alles tatsächlich läuft gut, bis in den Protokollen I Nachricht "Process com.foo.myapp (pid 12345) has died"
sehen, nach der die AlarmManager
nie wieder ein Update abfeuert.
Muss ich irgendeine Art von Kontrolle haben, die die Alarme neu gestartet werden? Zum Beispiel, wenn der Benutzer Zugriff auf die übergeordnete Anwendung des Widgets? Wie kann ich sicherstellen, dass ich die lange laufende Aufgabe abschließen können und kommen zurück in das Widget, wenn meine app in der Mitte der Anfrage stirbt?
Lösung
Beim Update wird Code ausgeführt gefeuert AsyncTask, die ein Netzwerk Anruf tätigt.
Wenn dies innerhalb des BroadcastReceiver
ist, wird das nicht funktionieren. Sie können nicht sicher Gabel Fäden von einem BroadcastReceiver
und AsyncTask
effektiv einen Thread gabelt seine Aufgabe asynchron zu tun.
Sie sollten stattdessen lang laufende Arbeit zu einem Service delegieren gestartet von dem Alarm BroadcastReceiver
.