1

Мне не очень повезло с обновлением виджета приложения с 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 никогда не запускает другое обновление.

Должен ли я иметь какую-то проверку, которая перезапустит аварийные сигналы? Например, когда пользователь обращается к родительскому приложению виджета? Как убедиться, что я могу выполнить долговременную задачу и вернуться к виджету, если мое приложение умирает в середине запроса?

ответ

4

При обновлении кода запуска выполняется код AsyncTask, который выполняет сетевой вызов.

Если это внутри BroadcastReceiver, это не сработает. Вы не можете безопасно форкировать потоки от BroadcastReceiver, а AsyncTask эффективно разветвляет поток для выполнения своей задачи асинхронно.

Вместо этого вы должны делегировать долговременную работу service started from the alarmBroadcastReceiver.

+0

ОК, я покупаю это - я не понимаю: почему моя тревога никогда не срабатывает после того, как приложение убито? Или это потому, что BroadcastReceiver умирает с приложением? Но тогда, даже если я запустил службу, что произойдет, если приложение будет убито так же? Я думаю, что я упускаю некоторые фундаментальные знания здесь – Bostone

+0

Кроме того - после запуска службы и получения блокировки я должен порождать поток для моей долговременной задачи или просто запускать ее как часть службы? – Bostone

+1

Я не знаю, почему AlarmManager никогда не срабатывает снова, но я рекомендую зафиксировать известную проблему (развернуть поток в BroadcastReceiver) и надеяться, что очистит неизвестную проблему (лоботомированный сигнал). IntentService автоматически запускает onHandleIntent() в фоновом потоке, поэтому вам не нужно форкировать свои собственные, если вы используете IntentService. – CommonsWare