AppWidgetHost aktualisiert keine Widgets

8

Kann ich AppWidgetHost in einem Fragment verwenden? Ich kann die meisten Widgets, die meinem AppWidgetHost hinzugefügt wurden, nicht aktualisieren. Hier ist mein Szenario ..

LauncherActivity.java

  • Ganz einfach, setContentView mit einem Layout aufrufen.

main.xml

  • Enthält ein paar Fragmente, einschließlich eines mit dem AppWidgetHost.

CodeRedWidgetHostFragment.java

  • onCreateView
     Instanzen von AppWidgetHost & amp; AppWidgetManager
     Erstellen und konfigurieren Sie meine Host-Ansicht mit einer Widget-ID, die ich in den Einstellungen gespeichert habe

  • onStart()
     appWidgetHost.startListening ()

  • onStop()
     appWidgetHost.stopListening ()

Wenn ich meine Instanzen von AppWidgetHost und AppWidgetManager bekomme, verwende ich getActivity (), um die Fragments-Hosting-Aktivität zu erhalten. Ich frage mich, ob das ist, warum meine Widgets nicht aktualisieren?

Einige Widgets werden tatsächlich aktualisiert, wie zum Beispiel die analoge Uhr, aber das Youtube-Widget schaltet nicht automatisch durch die Video-Thumbnails.

Ich sollte erwähnen, dass ich das Widget, das ich möchte, in meinem AppWidgetHost in einer anderen Aktivität auswähle, die die ID des ausgewählten Widgets in SharedPreferences speichert.

Hier ist der Code für meine Fragment-Klasse.

%Vor%     
brockoli 03.04.2014, 03:00
quelle

6 Antworten

0
___ answer31167766 ___

Ich habe das gleiche Problem und ich habe es (noch) nicht gelöst, aber es scheint ein Problem mit %code% zu sein. In meinem Fall ist die einzige Möglichkeit, es zu funktionieren, %code% zu deaktivieren oder %code% in einer neuen Instanz von %code% neu zu erstellen ... In Ihrem Fall könnte es hilfreich sein, %code% in %code% (oder sogar %code% ) wiederherzustellen ...

    
___ qstnhdr ___ AppWidgetHost aktualisiert keine Widgets ___ qstntxt ___

Kann ich %code% in einem %code% verwenden? Ich kann die meisten Widgets, die meinem AppWidgetHost hinzugefügt wurden, nicht aktualisieren. Hier ist mein Szenario ..

LauncherActivity.java

  • Ganz einfach, setContentView mit einem Layout aufrufen.

main.xml

  • Enthält ein paar Fragmente, einschließlich eines mit dem AppWidgetHost.

CodeRedWidgetHostFragment.java

  • %code%
     Instanzen von AppWidgetHost & amp; AppWidgetManager
     Erstellen und konfigurieren Sie meine Host-Ansicht mit einer Widget-ID, die ich in den Einstellungen gespeichert habe

  • %code%
     appWidgetHost.startListening ()

  • %code%
     appWidgetHost.stopListening ()

Wenn ich meine Instanzen von AppWidgetHost und AppWidgetManager bekomme, verwende ich getActivity (), um die Fragments-Hosting-Aktivität zu erhalten. Ich frage mich, ob das ist, warum meine Widgets nicht aktualisieren?

Einige Widgets werden tatsächlich aktualisiert, wie zum Beispiel die analoge Uhr, aber das Youtube-Widget schaltet nicht automatisch durch die Video-Thumbnails.

Ich sollte erwähnen, dass ich das Widget, das ich möchte, in meinem AppWidgetHost in einer anderen Aktivität auswähle, die die ID des ausgewählten Widgets in SharedPreferences speichert.

Hier ist der Code für meine Fragment-Klasse.

%Vor%     
___ antwort22994698 ___

Wenn einige Ihrer Widgets aktualisiert werden, glaube ich, dass Ihr getActivity () das Problem sein könnte.

Versuchen Sie, eine Referenz in Ihrem Fragment zu erstellen, zB:

%Vor%

und setze es in dir onAttach ()

%Vor%

Auf diese Weise sollte es immer auf Ihre aktuelle Hosting-Aktivität zeigen.

    
___ answer31705680 ___

Sie sollten %code% von %code% aufrufen, nachdem Sie %code% ausgeführt haben.

    
___ answer29377366 ___

Ich habe den Grund für das Problem gefunden, für Leute, die in Zukunft stecken bleiben, hier ist die Erklärung:

AppwidgetManager ist tatsächlich ein Systemdienst, und Sie erhalten keine neue Instanz beim Aufruf von AppwidgetManger.getInstance (Kontextkontext), sondern eine Referenz auf eine einzelne Instanz, die überall gleich ist (über Aktivitäten, Dienste ...).

AppwidgetManger Quelle:

%Vor%

Für mich bestand mein Problem darin, dass ich zwei Aktivitäten hatte und jede einen Verweis auf AppwidgetManager erhielt und pro Dokument appwidgetManger.startListening () in onStart () und onStopListening () in onStop () aufruft.

Aber wenn ich zur zweiten Aktivität wechselte, ist hier was den Fehler verursacht:

  • Aktivität1: onPause ()
  • Activity2: onCreate ()
  • Activity2: onStart () startListening ()
  • Activity1: onStop () stopListening ()
  • Aktivität1: onDestroy ()
  • Activity2: onResume ()

So ruft Aktivität 2 startListening () korrekt auf, aber im Hintergrund ist Aktivität 1 noch aktiv und ruft stopListening () für dieselbe AppwidgetManager-Instanz auf.

Außerdem sollten Sie dies ändern

%Vor%

bis

%Vor%

Es wird verhindern, dass das System den Verweis auf Ihre Aktivität behält und es vom GC fernhält (durch die Weitergabe wird ein Speicherleck erzeugt)

    
___ tag123androidfragments ___ Fragmente stellen wiederverwendbares Verhalten oder Teile der Benutzeroberfläche in einer Android-App dar. ___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ tag123host ___ Ein allgemeines Computersystem, das mit irgendeinem Kommunikationsnetzwerk oder Kommunikationsnetzwerken verbunden ist, um eine gemeinsame Nutzung von Ressourcen zwischen den teilnehmenden Systemen zu erreichen, wird als Host bezeichnet. ___ tag123androidwidget ___ Dies bezieht sich entweder auf Widgets für den Startbildschirm oder auf allgemeine Benutzeroberflächenelemente, die auf einem Android-Anwendungsbildschirm verwendet werden. ___ tag123androidappwidget ___ Android App Widgets sind benutzerdefinierte Ansichten, die auf dem Startbildschirm eines Android-Geräts platziert werden können. ___ answer36003217 ___

Aufbauend auf Clemens Antwort sollte der AppWidgetHost während des gesamten Lebenszyklus Ihrer Anwendung am Leben bleiben. Dies bedeutet, dass Sie unabhängig von der Aktivität eine Instanz von AppWidgetHost und AppWidgetManager haben sollten, die für Ihre App leicht zugänglich ist.

%Vor%

Meine aktuelle Implementierung wurde korrekt aktualisiert. Getestet mit vielen Apps, die Echtzeit-Updates benötigen, wie mein Musikplayer-Widget.

Beachten Sie, dass der Anwendungskontext verwendet wurde, um sicherzustellen, dass der Kontext für AppWidgetHost und AppWidgetManager immer verfügbar ist.

Auch , neuere Widgets, die die AppCompat-Bibliotheken in ihren Widgets verwenden, haben derzeit einen Fehler in den Abhängigkeiten von com.android.support:appcompat-v7:23.1.1. Um dies zu vermeiden, verwenden Sie den Anwendungskontext, wenn Sie Folgendes aufrufen.

%Vor%     
___ answer32795550 ___

Da Sie einen Launcher schreiben, würde ich Ihnen empfehlen, sich die offizieller Android Launcher . Im Gegensatz dazu verwendet zur Dokumentation den folgenden Mechanismus:

%Vor%

Achten Sie darauf, alle anderen Instanzen von %code% und %code% in Ihrem Code zu entfernen.

    
___
armandooj 10.04.2014 17:14
quelle
0

Ich habe den Grund für das Problem gefunden, für Leute, die in Zukunft stecken bleiben, hier ist die Erklärung:

AppwidgetManager ist tatsächlich ein Systemdienst, und Sie erhalten keine neue Instanz beim Aufruf von AppwidgetManger.getInstance (Kontextkontext), sondern eine Referenz auf eine einzelne Instanz, die überall gleich ist (über Aktivitäten, Dienste ...).

AppwidgetManger Quelle:

%Vor%

Für mich bestand mein Problem darin, dass ich zwei Aktivitäten hatte und jede einen Verweis auf AppwidgetManager erhielt und pro Dokument appwidgetManger.startListening () in onStart () und onStopListening () in onStop () aufruft.

Aber wenn ich zur zweiten Aktivität wechselte, ist hier was den Fehler verursacht:

  • Aktivität1: onPause ()
  • Activity2: onCreate ()
  • Activity2: onStart () startListening ()
  • Activity1: onStop () stopListening ()
  • Aktivität1: onDestroy ()
  • Activity2: onResume ()

So ruft Aktivität 2 startListening () korrekt auf, aber im Hintergrund ist Aktivität 1 noch aktiv und ruft stopListening () für dieselbe AppwidgetManager-Instanz auf.

Außerdem sollten Sie dies ändern

%Vor%

bis

%Vor%

Es wird verhindern, dass das System den Verweis auf Ihre Aktivität behält und es vom GC fernhält (durch die Weitergabe wird ein Speicherleck erzeugt)

    
Pdroid 31.03.2015 19:53
quelle
0

Ich habe das gleiche Problem und ich habe es (noch) nicht gelöst, aber es scheint ein Problem mit AppWidgetHost zu sein. In meinem Fall ist die einzige Möglichkeit, es zu funktionieren, stopListening() zu deaktivieren oder AppWidgetHostViews in einer neuen Instanz von AppWidgetHost neu zu erstellen ... In Ihrem Fall könnte es hilfreich sein, mAppWidgetHost in onStart() (oder sogar onResume() ) wiederherzustellen ...

    
C1710 01.07.2015 17:17
quelle
0

Sie sollten ViewGroup.removeAllViews() von parentView aufrufen, nachdem Sie mAppWidgetHost.stopListening() ausgeführt haben.

    
Eugene 29.07.2015 16:06
quelle
0

Da Sie einen Launcher schreiben, würde ich Ihnen empfehlen, sich die offizieller Android Launcher . Im Gegensatz dazu verwendet zur Dokumentation den folgenden Mechanismus:

%Vor%

Achten Sie darauf, alle anderen Instanzen von stopListening und startListening in Ihrem Code zu entfernen.

    
Clemens 26.09.2015 09:19
quelle
0

Aufbauend auf Clemens Antwort sollte der AppWidgetHost während des gesamten Lebenszyklus Ihrer Anwendung am Leben bleiben. Dies bedeutet, dass Sie unabhängig von der Aktivität eine Instanz von AppWidgetHost und AppWidgetManager haben sollten, die für Ihre App leicht zugänglich ist.

%Vor%

Meine aktuelle Implementierung wurde korrekt aktualisiert. Getestet mit vielen Apps, die Echtzeit-Updates benötigen, wie mein Musikplayer-Widget.

Beachten Sie, dass der Anwendungskontext verwendet wurde, um sicherzustellen, dass der Kontext für AppWidgetHost und AppWidgetManager immer verfügbar ist.

Auch , neuere Widgets, die die AppCompat-Bibliotheken in ihren Widgets verwenden, haben derzeit einen Fehler in den Abhängigkeiten von com.android.support:appcompat-v7:23.1.1. Um dies zu vermeiden, verwenden Sie den Anwendungskontext, wenn Sie Folgendes aufrufen.

%Vor%     
Chris Sullivan 15.03.2016 05:20
quelle