2010-01-16 8 views
33

Ich versuche ein einfaches Widget für die Anzeige auf dem Startbildschirm zu implementieren. Das Problem ist, dass onUpdate nur einmal aufgerufen wird, wenn ich das Widget installiere. Die Konfiguration ist unten. Hinweis: Ich werde den Update-Zeitraum nicht um 20 Sekunden verlassen, da ich weiß, dass das den Akku zerstören würde (nur testen).Android Widget wird nicht aktualisiert

Konfiguration:

<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>` 

Manifest Auszug:

<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> 

ich das folgende Verhalten beobachte, wenn ich das Widget installieren: In meiner WidgetProvider Klasse auf OnReceive dann dann OnReceive onEnabled genannt wird, dann OnUpdate.

Danach wird das Widget angezeigt und OnUpdate wird nie wieder aufgerufen. Ich überprüfe auch die Einstellungen des Provders, wenn OnUpdate aufgerufen wird und alles, was oben in XML (z. B. Aktualisierungszeitraum) eingestellt wurde, korrekt ist.

Antwort

67

Während Sie android:updatePeriodMillis auf 20 Sekunden eingestellt haben, beträgt die minimale tatsächliche Zeit 30 Minuten. Also, wenn Sie nicht 30 Minuten gewartet haben, um zu sehen, ob es während Ihres Tests ein Update gibt, müssen Sie etwas länger warten.

+3

Danke. Ich ging Zeile für Zeile durch die Dokumente und sie haben das nicht erwähnt. Basierend auf Ihrer Antwort habe ich jedoch weiter gegriffen und festgestellt, dass ich mir 1.5 Dokumente anschaue. Das Minimum ist dokumentiert und offensichtlich gibt es einen Alarmansatz, falls eine höhere Aktualisierungsfrequenz benötigt wird. Vielen Dank. – phogel

+2

Wie über die Uhr oder Wetter Update Widgets? Wie sie aktualisiert werden. –

+3

Wenn einer von Ihnen eine API erstellt: Dies ist nicht, wie Sie es tun. Wenn Einschränkungen für den Wertebereich bestehen, machen Sie dies dem Verbraucher absolut klar, indem Sie bei der Kompilierungszeit oder der Worst-Case-Laufzeit versagen. – Nilzor

18

Aus dem SDK:

Hinweis: Wenn das Gerät schläft, wenn es Zeit für ein Update (wie definiert durch updatePeriodMillis) ist, dann wird das Gerät nach oben, um weckt das Update durchzuführen. Wenn Sie nicht mehr als einmal pro Stunde aktualisieren, führt dies wahrscheinlich nicht zu erheblichen Problemen mit der Akkulaufzeit.

Wenn Sie jedoch häufiger aktualisieren müssen und/oder keine Aktualisierung durchführen müssen, während das Gerät schläft, können Sie stattdessen Aktualisierungen basierend auf einem Alarm durchführen, der das Gerät nicht aktiviert.

Stellen Sie dazu einen Alarm mit der Absicht ein, dass Ihr AppWidgetProvider empfängt, indem Sie AlarmManager verwenden. Stellen Sie den Alarmtyp auf ELAPSED_REALTIME oder RTC ein, wodurch der Alarm nur ausgelöst wird, wenn das Gerät aktiv ist. Stellen Sie dann updatePeriodMillis auf zero ("0").

Und wenn SDK 1.6+:

Hinweis: Updates mit updatePeriodMillis angefordert wird alle 30 Minuten mehr als einmal nicht zugestellt werden.

1

wie duduli sagte ... Verwenden Sie einen AlarmManager, um eine Absicht an Ihre Widget-Klasse zu senden, wird es in seiner OnReceive-Methode erhalten, wenn Sie nicht wissen, wie es geht, folgen this guide. Es funktionierte für mich und andere