Przede wszystkim sprawdź mój post na temat zachowanych fragmentów. To może pomóc.
Teraz, aby odpowiedzieć na twoje pytania:
Czy fragment zachowuje również stan widoku , czy też zostanie odtworzony po zmianie konfiguracji - co dokładnie jest „zachowane”?
Tak, Fragment
stan zostanie zachowany podczas zmiany konfiguracji. W szczególności „zachowane” oznacza, że fragment nie zostanie zniszczony w wyniku zmian konfiguracji. Oznacza to, że Fragment
zostaną zachowane, nawet jeśli zmiana konfiguracji spowoduje Activity
zniszczenie instrumentu bazowego .
Czy fragment zostanie zniszczony, gdy użytkownik opuści działanie?
Podobnie jak Activity
s, Fragment
s może zostać zniszczony przez system, gdy zasoby pamięci są niskie. To, czy Twoje fragmenty zachowają stan instancji w trakcie zmian konfiguracji, nie będzie miało wpływu na to, czy system zniszczy je Fragment
po opuszczeniu Activity
. Jeśli opuścisz Activity
(tzn. Naciskając przycisk Home), Fragment
s może zostać zniszczony. Jeśli wyjdziesz Activity
, naciskając przycisk Wstecz (w ten sposób wywołując finish()
i skutecznie niszcząc Activity
), wszystkie Activity
dołączone Fragment
s zostaną również 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 to, że Activity
zawiera odniesienie do FragmentManager
i FragmentManager
zarządza backstackiem. Oznacza to, że bez względu na to, czy zdecydujesz się zachować swoje, Fragment
czy nie, Activity
(i tym samym FragmentManager
backstack) zostanie zniszczony przy zmianie konfiguracji. Innym powodem, dla którego może nie działać, jest to, że sytuacja może stać się trudna, jeśli zarówno zachowane fragmenty, jak i niezarezerwowane fragmenty zostaną dopuszczone do istnienia na tym samym plecaku.
Jakie są przypadki użycia, w których warto zastosować tę metodę?
Zachowane fragmenty mogą być bardzo przydatne do propagowania informacji o stanie - zwłaszcza zarządzania wątkami - między instancjami działania. Na przykład fragment może służyć jako host dla instancji Thread
lub AsyncTask
, zarządzając jego działaniem. Zobacz mój post na blogu na ten temat, aby uzyskać więcej informacji.
Ogólnie potraktowałbym to podobnie do używania onConfigurationChanged
z Activity
... nie używaj go jako bandaida tylko dlatego, że jesteś zbyt leniwy, aby poprawnie wdrożyć / obsłużyć zmianę orientacji. Używaj go tylko wtedy, gdy potrzebujesz.