Odpowiedz

38

Czy lepiej związać usługi FragmentActivity ... lub fragmentowi

Są takie same jak masz je tutaj napisane. getActivity() nie jest Fragment - jest to metoda zwracająca wartość Activity. Nie można zadzwonić pod numer bindService() na numer Fragment.

Co to jest lepsza praktyka?

Ani. Powiąż obiekt Application, uzyskany przez getApplicationContext(), z ServiceConnection zarządzanym przez (lub być może w rzeczywistości będącym) zachowanym Fragment.

Powodem są zmiany w konfiguracji. Wiązanie jest stanem. Musisz zachować ten stan przez zmiany konfiguracji. Podczas gdy zatrzymany Fragment może pomieścić ServiceConnection, istnieje niejawny remis w systemie pomiędzy ServiceConnection i Context, który zarejestrował go dla wiązania. Ponieważ działania mogą zostać zniszczone i odtworzone po zmianie konfiguracji, numer Activity nie jest dobrym wyborem tutaj: Context. Application, który jest systemem globalnym, jest bezpieczniejszym wyborem i jednym z niewielu miejsc, w których wybór Application na inny Context jest mądrym posunięciem IMHO.

Here is a blog post z mojego, od czasu przed fragmentami, które dostaje się do tego trochę więcej. Here is a sample project demonstrując technikę.

+0

Czy możesz podzielić się swoją opinią na ten temat: http://stackoverflow.com/questions/24309379/bind-service-to-activity-or-fragment – Anjani

+0

Patrząc na twoje demo, wygląda na to, że masz przeciekającą pamięć. Zachowujesz odniesienie do elementu interfejsu użytkownika w zatrzymanym Fragmentie, więc stary Kontekst będzie nadal odwoływany, nawet jeśli konfiguracja mogła ulec zmianie. Zachowałbym elementy UI w osobnym Fragmentie. – mkuech

+0

@mkuech: Ten element UI jest ustawiony na nową wartość w 'onCreateView()'. Dlatego po zmianie konfiguracji fragment nie będzie już trzymał starego widgetu. – CommonsWare

Powiązane problemy