我没有太多的运气,用AlarmManager
生成的广播更新应用程序窗口小部件。这是我做的:Android - AppWidgets,AlarmManager和AsyncTask
初始化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
从未激发另一个更新。
我需要进行某种检查来重新启动警报吗?例如,当用户访问小部件的父应用程序?我如何确保我可以完成长时间运行的任务,并且如果我的应用程序在请求中途死亡,则返回小部件?
好的,我买了 - 我不明白:为什么我的闹钟在应用程序被杀后不会重新启动?还是因为BroadcastReceiver与应用程序一起死亡?但是,即使我运行服务,如果应用程序以同样的方式死亡,会发生什么?我想我在这里错过了一些基础知识 – Bostone 2009-12-08 06:43:29
另外 - 在启动服务并获得锁定后,我应该为长时间运行的任务生成一个线程,或者将它作为服务的一部分运行? – Bostone 2009-12-08 06:52:16
我不知道为什么AlarmManager不会再次触发,但我建议修复已知问题(在BroadcastReceiver中分支一个线程),并希望清除未知问题(lobotomized alarm)。 IntentService自动在后台线程中运行onHandleIntent(),因此如果您使用IntentService,则不需要自行分支。 – CommonsWare 2009-12-08 09:34:36