Android 在启动时注册appwidgets的内容观察者
当用户将我的appwidget添加到主屏幕时,我正在注册一个Android 在启动时注册appwidgets的内容观察者,android,boot,reboot,contentobserver,android-appwidget,Android,Boot,Reboot,Contentobserver,Android Appwidget,当用户将我的appwidget添加到主屏幕时,我正在注册一个ContentObserver。预期的行为是,对myContentProvider中基础数据的更改将触发我的appwidget更新。问题是,如果用户随后重新启动设备,我将不再注册ContentObserver Android的AppWidget框架似乎在设备启动后不提供任何设置的挂钩,因此我无法在数据上注册另一个ContentObserver。我能想到的唯一解决方案是创建一个在清单中注册的BroadcastReceiver,它接收BOO
ContentObserver
。预期的行为是,对myContentProvider
中基础数据的更改将触发我的appwidget更新。问题是,如果用户随后重新启动设备,我将不再注册ContentObserver
Android的AppWidget框架似乎在设备启动后不提供任何设置的挂钩,因此我无法在数据上注册另一个ContentObserver
。我能想到的唯一解决方案是创建一个在清单中注册的BroadcastReceiver,它接收BOOT_COMPLETED操作。不过我希望不必这样做
是否有任何方法在引导后注册ContentObserver(或执行与AppWidgets相关的任何其他设置),以便现有AppWidgets在设备重新引导期间继续正常工作?(如果可能的话,是否有这方面的样本?)
编辑:
它出现在启动后调用my AppWidgetProvider,并且OneEnabled和onUpdate回调都会发生。它启动我的AppWidgetService并创建一个RemoteViewsFactory——此时我应该注册一个ContentObserver
无论出于何种原因,当我的ContentProvider中的数据发生更改时,ContentObserver不会触发。我不明白为什么。编辑
这个答案有点过时。仅为保存ContentObserver而提供服务有点笨手笨脚,用户可能会觉得奇怪,应用程序在不理解原因的情况下保留服务。此外,操作系统还可以终止服务,这样您就没有ContentObserver了
当您更改数据时,最好强制自己刷新AppWidget。谷歌在其iosched应用程序中也做到了这一点:
// Widgets can't register content observers so we refresh widgets separately.
context.sendBroadcast(ScheduleWidgetProvider.getRefreshBroadcastIntent(context, false));
资料来源:
原始答案
我通过创建一个新的服务类解决了自己的问题。我在AppWidgetProvider的OneEnabled()
回调中启动服务,并在onDisabled()
回调中停止服务。内容观察者在服务的onCreate()
中注册,并在onDestroy
中注销
这种方法可以在底层数据发生变化时更新所有我的AppWidget,并在设备重新启动时工作。如何创建服务?你能提供一些代码吗?我最感兴趣的是配置,因为我正在寻找可靠注册
ContentObserver
的方法。这个问题有点过时了。让服务运行是不值得的,而且服务可以被操作系统终止。当数据更改时,强制刷新小部件可能更好。我知道保持服务运行效率不高,但我尝试的任何注册ContentObserver
的方法都失败了。每次我的ContentObserver
被操作系统注销时,我都无法确定何时以及为什么。到目前为止,最好的解决方案在夜间停止工作。所以现在我在测试原始答案的方法。来自ScheduleWidgetProvider的方法适用于刷新按钮,但我需要可靠的方法进行即时更新。