2012-05-17 54 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廣播。不是一個很乾淨的方式,但它的工作原理。

相關問題