Мне не очень повезло с обновлением виджета приложения с AlarmManager
сгенерированными трансляциями. Вот что я делаю:Android - AppWidgets, AlarmManager и AsyncTask
AlarmManager
Initializing на AppWidgetProvider#onEnabled
AlarmManager alarms = (AlarmManager) context.getSystemService(
Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 60000, pendingIntent);
Я также определить приемник вещания, который просто прослушивает обновлений, выпущенных в AlarmManager
. При обновлении кода кода запускается AsyncTask
, что делает сетевой вызов. Когда AsyncTask
завершен (onPostExecute
), он использует ранее полученный экземпляр AppWidgetManager
для обновления виджетов. Все это работает хорошо, пока в журналах я не вижу сообщение "Process com.foo.myapp (pid 12345) has died"
, после которого AlarmManager
никогда не запускает другое обновление.
Должен ли я иметь какую-то проверку, которая перезапустит аварийные сигналы? Например, когда пользователь обращается к родительскому приложению виджета? Как убедиться, что я могу выполнить долговременную задачу и вернуться к виджету, если мое приложение умирает в середине запроса?
ОК, я покупаю это - я не понимаю: почему моя тревога никогда не срабатывает после того, как приложение убито? Или это потому, что BroadcastReceiver умирает с приложением? Но тогда, даже если я запустил службу, что произойдет, если приложение будет убито так же? Я думаю, что я упускаю некоторые фундаментальные знания здесь – Bostone
Кроме того - после запуска службы и получения блокировки я должен порождать поток для моей долговременной задачи или просто запускать ее как часть службы? – Bostone
Я не знаю, почему AlarmManager никогда не срабатывает снова, но я рекомендую зафиксировать известную проблему (развернуть поток в BroadcastReceiver) и надеяться, что очистит неизвестную проблему (лоботомированный сигнал). IntentService автоматически запускает onHandleIntent() в фоновом потоке, поэтому вам не нужно форкировать свои собственные, если вы используете IntentService. – CommonsWare