2010-01-16 100 views
33

我試圖實現一個簡單的小部件,以在主屏幕上顯示。我遇到的問題是onUpdate只在安裝widget時被調用一次。配置如下。注意:我不會在20秒內更新更新週期,因爲我知道會殺死電池(只是測試)。Android Widget不更新

配置:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="294dp" 
    android:minHeight="72dp" 
    android:updatePeriodMillis="20000" 
    android:initialLayout="@layout/my_custom_app_widget">` 
</appwidget-provider>` 

清單摘錄:

<receiver android:name="MyCustomWidgetProvider"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data android:name="android.appwidget.provider" 
     android:resource="@xml/my_custom_app_widget_info" /> 
</receiver> 

我觀察以下行爲,當我安裝插件: 在我上的onReceive WidgetProvider類被稱爲然後再onEnabled的onReceive,然後的onUpdate。

之後,小部件顯示和onUpdate不會再次被調用。當onUpdate被調用時,我還會檢查提供者的設置,並且上面的XML(例如update period)中設置的所有東西都是正確的。

回答

67

雖然您的android:updatePeriodMillis設置爲20秒,但實際最短時間爲30分鐘。因此,如果您在測試期間沒有等待30分鐘以查看是否有更新,則需要等待更長時間。

+3

謝謝。我正在逐行閱讀文檔,他們沒有提到這一點。然而,根據你的回答,我進一步發現並注意到我正在看1.5個文檔。如果需要更高的更新頻率,最低限度是有記錄的,並且顯然有報警方法。謝謝。 – phogel 2010-01-16 16:59:38

+2

時鐘或天氣更新小工具如何?他們如何更新。 – 2013-12-18 17:31:05

+3

如果你們中的任何人正在構建API:這不是你如何做到的。如果對值範圍有限制,則通過在編譯時或最差情況下運行時失敗來明確消費者。 – Nilzor 2015-05-13 06:27:06

18

從SDK:

注:如果設備處於睡眠狀態時,它是時間的更新(由updatePeriodMillis定義),則該設備將依次執行更新醒來。如果您每小時不更新一次,這可能不會對電池壽命造成重大問題。

但是,如果您需要更頻繁地更新和/或在設備處於睡眠狀態時不需要更新,則可以基於不會喚醒設備的警報執行更新。

爲此,請使用AlarmManager設置您的AppWidgetProvider收到的意圖警報。將警報類型設置爲ELAPSED_REALTIMERTC,該警報類型僅在設備清醒時發出警報。然後將updatePeriodMillis設置爲zero(「0」)。

當SDK 1.6+:

注:與updatePeriodMillis要求更新將不高於每30分鐘一次傳遞更多。

1

as duduli said ...使用一個alarmManager向你的Widget類發送一個意圖,如果你不知道如何去做,它會在onReceive方法中接收它,遵循this guide。它適用於我和其他人