当用户将我的appwidget添加到主屏幕时,我正在注册ContentObserver
。预期的行为是对ContentProvider
中基础数据的更改将触发我的appwidget更新。问题是如果用户然后重新启动设备,我不再注册ContentObserver
。
Android的AppWidget框架在设备启动后似乎没有提供任何挂钩来进行任何类型的设置,因此我无法在数据上注册另一个ContentObserver
。我能想到的唯一解决方案是创建一个在清单中注册的BroadcastReceiver,它接收BOOT_COMPLETED操作。我希望不要这样做。
有没有办法在启动后注册ContentObserver(或执行与AppWidgets相关的任何其他设置),以便现有的appwidgets能够在设备重启后继续正常运行? (如果可能的话,某个地方是否有样本?)
编辑:
在启动后,我的AppWidgetProvider被调用,并且onEnabled和onUpdate回调都会发生。它启动我的AppWidgetService并创建一个RemoteViewsFactory - 此时我应该注册一个ContentObserver。
无论出于何种原因,当ContentProvider中的数据发生更改时,ContentObserver不会触发。我无法弄清楚原因。
答案 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。