Android - AppWidgets, AlarmManager e AsyncTask
-
16-09-2019 - |
Pergunta
Eu não estou tendo muita sorte com a atualização de um widget aplicativo com AlarmManager
gerado transmissões. Aqui está o que eu faço:
A inicialização AlarmManager
em AppWidgetProvider#onEnabled
AlarmManager alarms = (AlarmManager) context.getSystemService(
Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 60000, pendingIntent);
Eu também definir receptor de radiodifusão que simplesmente escuta para as atualizações que disparados pelo AlarmManager
. Quando a atualização é disparado código é executado AsyncTask
que faz uma chamada de rede. Quando o AsyncTask
é concluída (onPostExecute
) ele usa instância previamente obtida de AppWidgetManager
para atualizar o widget (s).
Tudo realmente funciona bem até que nos logs vejo "Process com.foo.myapp (pid 12345) has died"
mensagem após o qual o AlarmManager
nunca dispara outra atualização.
Eu preciso ter algum tipo de verificação que irá reiniciar os alarmes? Por exemplo, quando o acesso do usuário do aplicativo pai do widget? Como posso garantir que eu possa completar a tarefa de longa duração e voltar para o widget se meus morre de aplicativos no meio do pedido?
Solução
Quando atualização é disparados código é executado AsyncTask que faz uma chamada de rede.
Se isto está dentro do BroadcastReceiver
, que não vai funcionar. Você pode threads não segura garfo de um BroadcastReceiver
e AsyncTask
bifurca efetivamente um fio para fazer a sua tarefa de forma assíncrona.
Em vez disso, você deve delegar longa trabalho para um serviço iniciado a partir do alarme BroadcastReceiver
.