在启动时注册appwidgets的内容观察者

时间:2013-04-02 16:04:03

标签: android boot reboot contentobserver android-appwidget

当用户将我的appwidget添加到主屏幕时,我正在注册ContentObserver。预期的行为是对ContentProvider中基础数据的更改将触发我的appwidget更新。问题是如果用户然后重新启动设备,我不再注册ContentObserver

Android的AppWidget框架在设备启动后似乎没有提供任何挂钩来进行任何类型的设置,因此我无法在数据上注册另一个ContentObserver。我能想到的唯一解决方案是创建一个在清单中注册的BroadcastReceiver,它接收BOOT_COMPLETED操作。我希望不要这样做。

有没有办法在启动后注册ContentObserver(或执行与AppWidgets相关的任何其他设置),以便现有的appwidgets能够在设备重启后继续正常运行? (如果可能的话,某个地方是否有样本?)

编辑

在启动后,我的AppWidgetProvider被调用,并且onEnabled和onUpdate回调都会发生。它启动我的AppWidgetService并创建一个RemoteViewsFactory - 此时我应该注册一个ContentObserver。

无论出于何种原因,当ContentProvider中的数据发生更改时,ContentObserver不会触发。我无法弄清楚原因。

1 个答案:

答案 0 :(得分:2)

修改

这个答案有点过时了。仅为持有ContentObserver而提供服务有点沉重,用户可能会觉得奇怪的是,应用程序在不了解原因的情况下保持服务。此外,操作系统可以终止服务,这使您没有ContentObserver。

最好在数据更改时强制刷新您的appwidgets。谷歌也在他们的iosched应​​用程序中做到了这一点:

// Widgets can't register content observers so we refresh widgets separately.
context.sendBroadcast(ScheduleWidgetProvider.getRefreshBroadcastIntent(context, false));

来源:ScheduleProvider ScheduleWidgetProvider

原始回答

我通过创建一个新的Service类解决了我自己的问题。我在AppWidgetProvider的onEnabled()回调中启动该服务,并在onDisabled()回调中停止该服务。内容观察者已在服务onCreate()中注册,并在onDestroy中未注册。

这种方法可以在基础数据发生变化时通过设备重启来更新我的所有appwidge。