我在使用 AlarmManager
生成的广播更新应用小部件方面运气不佳。这就是我所做的:
在AppWidgetProvider#onEnabled
上初始化AlarmManager
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 60000, pendingIntent);
我还定义了 BroadcastReceiver
,它仅监听 AlarmManager
触发的更新。当更新被触发时,代码运行AsyncTask
来进行网络调用。当 AsyncTask
完成 (onPostExecute
) 时,它使用之前获得的 AppWidgetManager
实例来更新小部件。
实际上一切都运行良好,直到我在日志中看到消息,之后 AlarmManager
再也不会触发另一个更新:
Process com.foo.myapp (pid 12345) has died
我是否需要进行某种检查来重新启动警报?例如,当用户访问小部件的父应用程序时?如果我的应用程序在请求过程中终止,如何确保我可以完成长时间运行的任务并返回到小部件?
最佳答案
When update is fired code runs AsyncTask that makes a network call.
如果这是在 BroadcastReceiver
内部,则不起作用。您无法从 BroadcastReceiver
安全地 fork 线程,而 AsyncTask
可以有效地 fork 线程以异步方式执行其任务。
相反,您应该将长时间运行的工作委托(delegate)给 service started from the alarm 广播接收器
。
关于Android - AppWidgets、AlarmManager 和 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1864153/