Ich programmiere einen Musik-Player und die Musik spielt in einem Hintergrund Service
. Wenn der Benutzer den Activity
, der 3 Fragments
hostet, killt und dann den Activity
erneut startet, sende ich ein Broadcast
von Service
, das Informationen über das aktuelle Lied und die Liste der Lieder enthält Der Benutzer hat seiner Sitzung hinzugefügt.
Das Problem ist, dass jedes Mal, wenn ich die letzte Information in Fragments
einstellen möchte, nichts passiert, weil ihre Erstellung zu lange dauert und die Broadcast
nicht so behandelt wird, wie sie sollte.
Wie kann ich Service
oder Broadcast
warten lassen, bis die Fragmente erstellt sind, damit sie entsprechend behandelt werden?
Hier sind die relevanten Code-Schnipsel:
%Vor%Da ich einen Dienst für die Medienwiedergabe verwendete, wollte ich die zuletzt gehörten Songs vom Dienst abrufen, damit ich sie direkt abspielen konnte. Das war eine alte Logik, aber ich habe meinen Code dafür gebaut. Bis dahin stieß ich darauf rein.
FragmentActivity
wird erstellt Service
wird gestartet und an Fragments
asynchron erstellt Service
startet, sendet er eine Broadcast
mit den neuesten Informationen Service
und Fragment
asynchron sind, würde die Broadcast-Nachricht vom Service gesendet werden, aber weil die BroadcastReceivers
in Fragments
noch nicht initialisiert wurden, würden sie nicht empfangen das Intent
. Ich musste irgendwie einen Rückruf verwenden, der dafür sorgte, dass
Also habe ich ServiceConnection
verwendet und um genau zu sein, die Methode onServiceConnected()
. Dort habe ich die Voreinstellungen, in denen der letzte Song gespeichert wurde, und dann die Broadcast
und die Fragments
gesendet und die Views
wurden entsprechend gesetzt. Dies funktionierte auch für Orientierungsänderungen.
Am einfachsten wäre es, die Informationen zu behalten, bis das Fragment bereit ist, es anzuzeigen. Verwenden Sie die setArguments()
-Methode des Fragments, um die Informationen an das Fragment anzuhängen.
Dann, in onCreateView()
des Fragments, ziehen Sie einfach die Argumente von getArguments()
und bauen Sie die Ansicht mit den Werten auf.
Eine andere Möglichkeit wäre, Setter-Methoden zu verwenden, bei denen das Fragment selbst Werte in ein Bündel für setArguments()
legt. Auf diese Weise können Sie die Ansichten jedes Mal aktualisieren, wenn die Ansicht erstellt wurde, zusätzlich zu den Argumenten für das mögliche Ereignis, wenn die Ansicht des Fragments zerstört ist und neu erstellt werden muss.
Hinweis: Sie können setArguments()
nur aufrufen, bevor das Fragment an die Aktivität angehängt wurde. Sie können jedoch das von setArguments
übergebene Bundle aktualisieren, indem Sie einen Verweis darauf von getArguments()
abrufen und dann einfach die Werte eingeben. Also, anstatt setArguments()
von Ihrem Empfänger aus aufzurufen, tun Sie etwas wie folgt:
Meine Lösung bestand lediglich darin, eigene Callback-Interfaces zu erstellen. Ganz am Ende der onCreateView-Methode des ur-Fragments rufen Sie einfach Ihre Callback-Methode auf, die Ihrer Hauptaktivität mitteilt, dass die Erstellung abgeschlossen ist.
Es hat für mich funktioniert, die Hoffnung hilft dir auch.
Tags und Links android android-fragments android-service transactions