Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在启动时注册appwidgets的内容观察者_Android_Boot_Reboot_Contentobserver_Android Appwidget - Fatal编程技术网

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

Android 在启动时注册appwidgets的内容观察者,android,boot,reboot,contentobserver,android-appwidget,Android,Boot,Reboot,Contentobserver,Android Appwidget,当用户将我的appwidget添加到主屏幕时,我正在注册一个ContentObserver。预期的行为是,对myContentProvider中基础数据的更改将触发我的appwidget更新。问题是,如果用户随后重新启动设备,我将不再注册ContentObserver Android的AppWidget框架似乎在设备启动后不提供任何设置的挂钩,因此我无法在数据上注册另一个ContentObserver。我能想到的唯一解决方案是创建一个在清单中注册的BroadcastReceiver,它接收BOO

当用户将我的appwidget添加到主屏幕时,我正在注册一个
ContentObserver
。预期的行为是,对my
ContentProvider
中基础数据的更改将触发我的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的方法适用于刷新按钮,但我需要可靠的方法进行即时更新。