2010-12-12 11 views
8
aktualisieren

Ich habe eine einfache Appwidget und ich möchte es aktualisieren, wenn eine Aktion in einer Aktivität (in der gleichen App) auftritt. In OnUpdate(), ich aktualisiere sofort das Widget, das funktioniert gut. In meiner Aktivität rufe ich dieselbe statische Update-Methode in meinem Appwidget auf, die in OnUpdate() aufgerufen wird, um die Ansichten zu aktualisieren. Das Widget wird nicht aktualisiert.Android Appwidget wird nicht von Aktivität

Ich kann den Code direkt in die AppWidgetManager.updateAppWidget() -Methode verfolgen, und das alles gut, aber das Widget wird nicht aktualisiert.

Der einzige mögliche Unterschied, den ich sehen kann, ist, dass das Context-Objekt, das in meine statische Update-Methode übergeben wird, anders ist, wenn es aus dem Kontext einer Aktivität vs. Kontext der OnUpdate() -Methode eines Appwidgets aufgerufen wird. Es gibt jedoch viele Beispiele im Internet, also erwarte ich, dass es funktionieren sollte.

Antwort

19

Ohne Ihren Code zu sehen bin ich nicht 100% sicher, wie Sie es versuchen, aber hier ist die Methode, die ich verwende. In meinem Activity habe ich die folgende Methode:

private void updateAllWidgets(){ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class)); 
    if (appWidgetIds.length > 0) { 
     new MyWidget().onUpdate(this, appWidgetManager, appWidgetIds); 
    } 
} 

Wo MyWidget die Klasse des appwidget ist. Ich kann diese Methode von überall in meinem Activity aufrufen, um alle meine Appwidgets zu aktualisieren.

+1

die Dinge gemacht arbeiten, so muss es sein, dass ich nicht die Aktualisierung wurde korrekte ID Wie es war, richtet das Widget einen Onclick Intent mit seiner ID ein, die von der Aktivität empfangen wird, die dann dem Widget mitteilt, sich selbst zu aktualisieren. –

+0

Ich denke nicht, dass das Aufrufen der OnUpdate-Methode der richtige Ansatz ist. Sie sollten eine Übertragung für AppWidgetManager.ACTION_APPWIDGET_UPDATE senden. – midhunhk

+0

@silverback von einem "es richtig zu tun" -Ansatz, stimme ich Ihnen zu, dass der richtige Weg, es zu tun ist, eine Sendung zu senden. Von einem "Just much it work" -Ansatz führt das obige dazu, dass die App-Widgets aktualisiert werden - schmutzig, aber funktional. –

9

Anstatt eine statische Methode zu verwenden, nutzen Sie die Tatsache, dass das Widget bereits ein Broadcast-Empfänger ist, und registrieren Sie eine Update-Absicht dafür in Ihrem Manifest. Dann, wenn Sie es aus der Tätigkeit zu aktualisieren rufen Sie einfach

//in your activity 
sendBroadcast(new Intent(MyWidget.ACTION_UPDATE).putExtra(whatever)); 



//In widget class 
public static final String ACTION_UPDATE = "com.example.UPDATE_MY_WIDGET"; 

und in den Empfänger-Tags Ihrer Manifest-Datei

<intent-filter> 
    <action android:name="com.example.UPDATE_MY_WIDGET"/> 
</intent-filter> 
+0

Ich tat dies, aber ich änderte es, so dass das Widget nur einen Intent-Dienst startet. Warum? Das Widget führt eine möglicherweise lange laufende Operation aus. Ich habe ANR im Widget bekommen, wenn es auf update() nicht sofort zurückkam. nicht sicher, ob das mit meinem Problem zu tun hat. –

+0

ja jede lange Operation sollte einen IntentService, AsyncTask oder eine andere Art von Threading verwenden. Meine Antwort hier ist, wie ich Ihr Widget darüber informieren würde, dass es Zeit ist, die Aufgabe zu starten -oder-, um Ihr Widget darüber zu informieren, dass die Aufgabe abgeschlossen ist und den Status aktualisieren muss. – schwiz

+0

@schwiz Vor langer Zeit sollten Sie dennoch einen Dienst in Ihrem onUpdate() starten, um die lange Operation durchzuführen. Der Empfänger, den ich denke, benötigt ungefähr 5 Sekunden zur Ausführung. Das Erstellen einer AsyncTask ist ungenügend, weil sie ebenfalls zerstört würde, wenn der Empfänger zerstört wird. – HGPB

Verwandte Themen