2012-05-17 48 views
0

我需要在应用部件中使用Observer来订阅数据库更改。该文件说明这种设置的正确位置是onEnabled(),在AppWidgetProvider。但是,仅在添加新小部件时才会调用onEnabled()。如果应用程序启动并且小部件已经存在,它不会被调用,并且小部件中的数据不会更新。我应该在应用程序启动时发送ACTION_APPWIDGET_ENABLED广播还是有另一种方式做到这一点?如何在应用程序启动时初始化已添加的应用程序小部件?

回答

1

我需要在应用程序小部件中使用Observer来订阅数据库更改。

这是不可能的,除非你要运行永久服务,这不是一个好的设计模式。

如果这是您自己的数据库,那么当您更改数据库内容时,只需使用AppWidgetManager将更新推送到您的应用小部件。

+0

为什么这是不可能的?这在使用RemoteViewsService的API 14,15的WeatherListWidget示例中完成。 –

+0

@YuliaRogovaya:“为什么这是不可能的?” - “AppWidgetProvider”不是“服务”。它是一个'BroadcastReceiver'。一个'AppWidgetProvider'的实例将会持续几毫秒,并且不会做任何超越'onUpdate()'等方法的任何事情,比如注册一个'Observer'。恕我直言'WeatherListWidget'是一个非常破碎的示例,我将尝试与Google一起修复。 – CommonsWare

+0

在此示例中,在onEnabled()中注册了一个静态观察者。当在工作线程上调用此观察者的onChange()时,它会推送RemoteViewsService以更新小部件。问题是,仅在添加小部件时才调用onEnabled()。如果应用程序启动并且小部件已经存在,则初始化不会通过... –

0

尽管CommonsWare在上面的回答中正确,但保留应用程序窗口小部件的静态观察者的方法存在缺陷,为了解决已实现的问题,我在应用程序启动时发送了ACTION_APPWIDGET_ENABLED广播。不是一个很干净的方式,但它的工作原理。

相关问题