Zrozumienie fragmentu setRetainInstance(boolean)

Zaczynając od dokumentacji:

Public void setRetainInstance (Boolean retain)

Kontroluje, czy instancja fragmentu jest zachowywana podczas ponownego tworzenia aktywności(np. po zmianie konfiguracji). Można tego używać tylko z fragmentami nie znajdującymi się w tylnym stosie. Jeśli jest ustawione, cykl życia fragmentu będzie nieco inny, gdy aktywność zostanie odtworzona:

  • ondestroy () nie zostanie wywołany (ale onDetach() nadal będzie, ponieważ fragment jest oderwanie od bieżącej działalności).
  • OnCreate (Bundle) nie zostanie wywołany, ponieważ fragment nie jest ponownie tworzony.
  • onAttach (aktywność) i onActivityCreated (pakiet) będą nadal wywoływane.

Mam kilka pytań:

  • Czy fragment również zachowuje swój Widok, czy zostanie odtworzony po zmianie konfiguracji? Co dokładnie oznacza "zachowane"?

  • Czy fragment zostanie zniszczony, gdy użytkownik opuści aktywność?

  • Dlaczego nie działa z fragmentami na tylnym stosie?

  • Jakie są przypadki użycia, w których stosowanie tej metody ma sens?

Author: Community, 2012-06-25

5 answers

Po pierwsze, sprawdź mój post na zachowanych fragmentach. To może pomóc.

Teraz odpowiedzieć na twoje pytania:

Czy fragment zachowuje również swój stan view , czy zostanie odtworzony przy zmianie konfiguracji - co dokładnie oznacza "zachowane"?

Tak, Stan Fragment zostanie zachowany podczas zmiany konfiguracji. W szczególności "zachowany" oznacza, że fragment zostanie , a nie zniszczony podczas konfiguracji zmiany. Oznacza to, że Fragment zostanie zachowane, nawet jeśli zmiana konfiguracji spowoduje zniszczenie bazowego Activity.

Czy fragment zostanie zniszczony, gdy użytkownik opuści aktywność?

Podobnie jak Activity s, Fragment S mogą zostać zniszczone przez system, gdy zasoby pamięci są niskie. To, czy fragmenty zachowują swój stan wystąpienia podczas zmian konfiguracji, nie będzie miało wpływu na to, czy system zniszczy Fragmentraz zostawiasz Activity. Jeśli opuścisz Activity (tj. naciskając przycisk home), Fragment s mogą zostać zniszczone lub nie. Jeśli opuścisz Activity przez naciśnięcie przycisku Wstecz (wywołanie finish() i skuteczne zniszczenie Activity), wszystkie Activitydołączone Fragments również zostaną zniszczone.

Dlaczego nie działa z fragmentami na tylnym stosie?

Prawdopodobnie jest wiele powodów, dla których nie jest obsługiwany, ale najbardziej oczywistym powodem jest dla mnie to, że Activity posiada odniesienie do FragmentManager, a FragmentManager zarządza backstack. Oznacza to, że bez względu na to, czy zdecydujesz się zachować swoje Fragments, czy nie, Activity (a tym samym backstack FragmentManager) zostanie zniszczony po zmianie konfiguracji. Innym powodem, dla którego może to nie działać, jest to, że sprawy mogą się skomplikować, jeśli oba zachowane fragmenty i nie zachowane fragmenty mogą istnieć na tym samym zapleczu.

Które są przypadkami użycia, w których sensowne jest użycie tego metoda?

Zachowane fragmenty mogą być bardzo przydatne do propagowania informacji o stanie - zwłaszcza zarządzania wątkami-między instancjami aktywności. Na przykład fragment może służyć jako host dla instancji Thread lub AsyncTask, zarządzającej jej działaniem. Zobacz też mój wpis na blogu więcej informacji na ten temat.

Ogólnie traktowałbym to podobnie do używania onConfigurationChanged z Activity... nie używaj go jako bandaid tylko dlatego, że jesteś zbyt leniwy, aby poprawnie zaimplementuj / obsłuż zmianę orientacji. Używaj go tylko wtedy, gdy musisz.

 352
Author: Alex Lockwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-18 12:33:12

setRetaininstance jest użyteczny tylko wtedy, gdy twoja activity zostanie zniszczona i odtworzona z powodu zmiany konfiguracji, ponieważ instancje są zapisywane podczas wywołania onRetainNonConfigurationInstance. Oznacza to, że jeśli obrócisz urządzenie, zachowane fragmenty pozostaną tam(nie zostaną zniszczone i odtworzone.) ale kiedy runtime zabija aktywność w celu odzyskania zasobów, nic nie pozostaje. Po naciśnięciu przycisku back i zakończeniu aktywności, wszystko jest zniszczone.

Zazwyczaj używam tej funkcji do zapisywania zmiany orientacji Czas.Powiedzmy, że mam pobrać kilka Bitmap z serwera i każda z nich ma 1MB, gdy użytkownik przypadkowo obraca swoje urządzenie, na pewno nie chcę wykonywać całej pracy pobierania again.So tworzę Fragment trzymając moje bitmapy i dodaję je do menedżera i wywołuję setRetainInstance, Wszystkie bitmapy nadal tam są, nawet jeśli zmienia się orientacja ekranu.

 28
Author: suitianshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-06 05:27:17

SetRetainInstance (true) pozwala fragmentowi przetrwać. Jego członkowie zostaną zachowani podczas zmiany konfiguracji, takiej jak rotacja. Ale nadal może zostać zabity, gdy aktywność zostanie zabita w tle. Jeśli działanie zawierające w tle zostanie zabite przez system, jego instanceState powinien zostać poprawnie zapisany przez system, z którym obsługiwałeś onSaveInstanceState. Innymi słowy, onSaveInstanceState będzie zawsze wywoływany. Chociaż onCreateView nie będzie wywoływany, jeśli SetRetainInstance jest true i fragment / activity nie zostały jeszcze zabite, nadal będą wywoływane, jeśli zostaną zabite i będą próbowały zostać przywrócone.

Oto analiza aktywności/fragmentu Androida, mam nadzieję, że pomoże. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html

 12
Author: Kejun Xia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-15 14:23:58

SetRetainInstance () - Deprecated

Jako fragmenty Wersja 1.3.0-alpha01

Metoda setRetainInstance () na fragmentach została wycofana. Z wprowadzenie ViewModels, deweloperzy mają specyficzne API dla zachowanie stanu, który może być związany z działaniami, fragmentami i Wykresy nawigacyjne. Dzięki temu programiści mogą korzystać z normalnego, Nie zachowany Fragment i zachować określony stan, który chcą zachować oddzielne, unikając wspólnego źródła przecieki przy zachowaniu użyteczne właściwości pojedynczego stworzenia i zniszczenia zachowanego stan (czyli konstruktor ViewModel i onCleared() callback to receives).

 7
Author: Gastón Saillén,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-04 18:38:51

SetRetainInstance (boolean) jest przydatne, gdy chcemy mieć jakiś komponent, który nie jest związany z cyklem życia aktywności. Ta technika jest używana na przykład przez rxloader do "obsługi stylu życia Androida dla obserwowalnego rxjava" (który znalazłem tutaj ).

 2
Author: Marian Paździoch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-02 12:59:28