2009-12-08 100 views
1

我没有太多的运气,用AlarmManager生成的广播更新应用程序窗口小部件。这是我做的:Android - AppWidgets,AlarmManager和AsyncTask

初始化AlarmManagerAppWidgetProvider#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 2009-12-08 06:43:29

+0

另外 - 在启动服务并获得锁定后,我应该为长时间运行的任务生成一个线程,或者将它作为服务的一部分运行? – Bostone 2009-12-08 06:52:16

+1

我不知道为什么AlarmManager不会再次触发,但我建议修复已知问题(在BroadcastReceiver中分支一个线程),并希望清除未知问题(lobotomized alarm)。 IntentService自动在后台线程中运行onHandleIntent(),因此如果您使用IntentService,则不需要自行分支。 – CommonsWare 2009-12-08 09:34:36