2

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

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

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

编辑

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

但是,无论出于何种原因,当我的 ContentProvider 中的数据发生更改时,ContentObserver 都不会触发。我不知道为什么。

4

1 回答 1

2

编辑

这个答案有点过时了。仅仅为了持有一个 ContentObserver 而制作一个服务有点笨拙,用户可能会觉得奇怪的是,一个应用程序在不理解为什么的情况下保留了一个服务。操作系统也可以终止服务,这使您没有 ContentObserver。

当数据更改时,最好自己强制刷新您的应用程序小部件。Google 在他们的 iosched 应用程序中也这样做:

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

来源:ScheduleProvider ScheduleWidgetProvider

原始答案

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

这种方法可以让我的所有 appwidgets 在底层数据发生变化时更新,并通过设备重启工作。

于 2013-04-02T18:41:40.213 回答