Antwort

38

Ist es besseren Service FragmentActivity zu binden ... oder

Sie gleich fragmentieren, wie Sie sie hier geschrieben haben. getActivity() ist kein Fragment - es ist eine Methode, die Activity zurückgibt. Sie können bindService() nicht auf einem Fragment aufrufen.

Was ist eine bessere Praxis?

Weder. Binden an das Application Objekt, erhalten über getApplicationContext(), mit dem ServiceConnection verwaltet von (oder vielleicht eigentlich ist) ein beibehalten Fragment.

Der Grund ist Konfigurationsänderungen. Eine Bindung ist ein Zustand. Sie müssen diesen Status über Konfigurationsänderungen hinweg beibehalten. Während eine beibehaltene Fragment kann halten auf ServiceConnection, gibt es eine implizite Bindung im System zwischen ServiceConnection und Context, die es für eine Bindung registriert. Da Aktivitäten bei Konfigurationsänderungen zerstört und neu erstellt werden können, ist die Activity hier keine gute Wahl Context. Application, die system-global ist, ist eine sichere Wahl, und einer der wenigen Orte, an denen die Wahl Application über eine andere Context ist eine weise Bewegung IMHO.

Here is a blog post von mir, aus einer Zeit vor Fragmenten, das kommt in diesem ein bisschen mehr. Here is a sample project demonstriert die Technik.

+0

Könnten Sie bitte Ihre Meinung dazu teilen: http://stackoverflow.com/questions/24309379/bind-service-to-activity-or-fragment – Anjani

+0

Mit Blick auf Ihre Demo scheint es, dass Sie Speicher verlieren. Sie behalten einen Verweis auf ein UI-Element in einem beibehaltenen Fragment, sodass auf einen alten Kontext immer noch verwiesen wird, obwohl sich die Konfiguration möglicherweise geändert hat. Ich würde die UI-Elemente in einem separaten Fragment behalten. – mkuech

+0

@mkuech: Dieses UI-Element wird in 'onCreateView() 'auf einen neuen Wert gesetzt. Daher wird das Fragment nach der Konfigurationsänderung das alte Widget nicht mehr halten. – CommonsWare