Android - AppWidgets,AlarmManager和AsyncTask

时间:2009-12-08 02:04:37

标签: android android-asynctask android-appwidget alarmmanager

使用AlarmManager生成的广播更新应用小部件时,我没有太多运气。这是我的所作所为:

AlarmManager

上初始化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永远不会触发另一个更新。

我是否需要进行某种检查以重启警报?例如,当用户访问小部件的父应用程序时?如果我的应用程序在请求过程中死亡,我如何确保完成长时间运行的任务并返回到窗口小部件?

1 个答案:

答案 0 :(得分:4)

  

当触发更新时代码运行   发起网络呼叫的AsyncTask。

如果这在BroadcastReceiver内,那将无效。您无法安全地从BroadcastReceiver派生线程,AsyncTask有效地要求线程异步执行其任务。

相反,您应该将长期投放的作品委托给service started from the alarm BroadcastReceiver