Cześć, zastanawiam się, jak Android zarządza pamięcią i nigdzie nie mogę znaleźć dokładnej odpowiedzi. Załóżmy, że mam aplikację z 5 działaniami na bieżącym stosie aktywności (4 są zatrzymane, a 1 jest wznawiany), nie ma podłączonej usługi. Naciskam przycisk HOME, aby zatrzymać wszystkie moje czynności. Uruchamiam inną aplikację zużywającą pamięć i ogólna pamięć urządzenia zaczyna być niska. I pytanie brzmi
... Co się stanie z moją aplikacją?
- Czy system może zniszczyć tylko jedno lub kilka moich działań, aby odzyskać pamięć?
- Czy system zabije cały proces mojej aplikacji? Czy wszystkie działania zostaną ładnie zniszczone?
- Co się stanie, gdy wrócę do aplikacji, która została całkowicie usunięta? Czy zacznie od początku (tak jak przy pierwszym uruchomieniu), czy też spróbuje przywrócić czynności do stanu poprzedniego / jeśli tak - czy to tylko ta na szczycie stosu, czy wszystkie?
AKTUALIZACJA:
Zanim zadałem to pytanie, kilka razy widziałem cykl życia działania, ale nie ma on odpowiedzi na moje pytania. Zrobiłem kilka testów i mam kilka odpowiedzi. Wskazówką do testowania było „zatrzymanie procesu” w DDMS.
Nie testowałem odpowiedzi na pytanie 1, ale jako przewodnik mówi:
Jeśli czynność zostanie wstrzymana lub zatrzymana, system może usunąć ją z pamięci, prosząc ją o zakończenie lub po prostu zabijając jej proces.
Wydaje się, że jedną lub więcej aktywności można delikatnie (metodą onDestroy) zniszczyć bez przerywania procesu. Wracając do nich, po prostu otrzymasz (pakiet onCreate +).
Odpowiedź na pytanie 2:
TAK. Ogólnie system zabija cały proces, co oznacza, że wszystkie dane, w tym działania i pola statyczne, są niszczone. NIE jest to zrobione ładnie - nie dostaniesz się na Destroy ani finialize () dla żadnej z wstrzymanych / zatrzymanych działań. Dlatego metoda saveInstanceState () jest wywoływana tuż przed metodą onPause. onPause jest w zasadzie ostatnią metodą, w której należy coś zapisać, ponieważ po tej metodzie nigdy nie można było zobaczyć onStop ani onDestroy. System może po prostu zabić proces, niszcząc wszystkie obiekty, niezależnie od tego, co przechowują i cokolwiek robią.
Odpowiedź na pytanie 3:
Co się stanie, gdy wrócisz do zawieszonej aplikacji?
- Przed Androidem 2.2 - aplikacja będzie uruchamiana od początku, wraz z aktywnością programu uruchamiającego.
- Począwszy od 2.2 - system przywróci poprzedni stan aplikacji. Co to znaczy? Oznacza to, że ostatnia widoczna aktywność zostanie odtworzona (pakiet onCreate +). Co się stanie ze stosem aktywności? Stos jest w porządku, ale wszystkie działania na nim są martwe. Każdy z nich zostanie odtworzony (pakiet onCreate +), gdy wrócisz do niego przyciskiem Wstecz. Jest jeszcze jedna rzecz:
Zwykle system czyści zadanie (usuwa wszystkie działania ze stosu nad działaniem roota) w pewnych sytuacjach, gdy użytkownik ponownie wybiera to zadanie na ekranie głównym. Zwykle dzieje się tak, jeśli użytkownik nie odwiedził zadania przez określony czas, na przykład 30 minut.
Wniosek?
- Nie myśl, że problemy z obsługą rotacji działań można rozwiązać za pomocą androida: configChanges = "orientacja". Kiedy to zrobisz, napotkasz wiele innych problemów, o których nawet nie jesteś świadomy.
- Przetestuj swoją aplikację za pomocą DDMS - przycisk zatrzymania procesu. Zobacz
- Zachowaj ostrożność podczas używania zmiennych statycznych. Nie myśl, że kiedy zainicjujesz je w ćwiczeniu 1 - zainicjujesz je w działaniu 2. Jedynym bezpiecznym miejscem do zainicjowania globalnej statystyki byłaby klasa Application.
- Pamiętaj, że możesz nigdy nie zobaczyć onStop lub onDestroy. Zamknij pliki / bazy danych, zatrzymaj programy do pobierania w trybie onPause. Jeśli chcesz, aby aplikacja coś zrobiła w BG - użyj usługi pierwszego planu.
To by było na tyle ... Mam nadzieję, że pomogłem w moim eseju :)
Odpowiedzi:
Najpierw spójrz na to:
Tak więc, gdy przycisk „Home” na urządzeniu naciśnięciu, aktualna aktywność planie kładzie się na
onPause()
potemonStop()
, drugi 4 powinno pozostaćonStop()
Według dokumentów Google:
A dla cyklu życia procesu:
Wszystkie powyższe cytaty pochodzą z: Materiały referencyjne dla programistów Androida: Aktywność
Potwierdzono, że system może niszczyć nieczynne czynności i odtwarzać wspomnienia po uruchomieniu niektórych aplikacji zużywających pamięć. I możesz zaimplementować takie działania jak:
isFinishing()
w swojej aktywności, a następnie używając przycisku „zabij” w DDMS, aby wykryć, które z Twoich działań są odrzucane przez system. Ale myślę, że system najpierw zniszczy najstarszy. Jednak nie ma sensu zatrzymywanie innych działań, gdy „Uruchomienie działania” zostało poddane recyklingowi.AKTUALIZACJA
Oto kilka opinii, które znalazłem tutaj :
źródło
Tak. Android zabija czynności wykonywane w tle, gdy istnieje potrzeba pamięci. Zabicie jednego lub wszystkich może zależeć od pewnych warunków. Na przykład wstrzymanie lub zatrzymanie może spowodować, że android zabi działanie lub sam proces. Tutaj w ramach cyklu życia działania możesz uzyskać poniższe punkty. Zalecam ci pełne przejrzenie tej strony. Z pewnością rozwiąże Twoje wątpliwości.
Czynność dotyczy jednostki, a proces - grupy czynności. Spójrz na trzeci punkt powyżej, ponownie zabija proces, jak wspomniano.
Jest podobny do ponownego uruchomienia. Znowu trzeci punkt da ci kilka odpowiedzi, takich jak
When it is displayed again to the user, it must be completely restarted and restored to its previous state
Uzyskaj więcej informacji na temat rzeczy związanych z pamięcią tutaj .
Edycja:
wszystkie działania w aplikacji są wykonywane w jednym procesie. Więc kiedy proces zostanie zabity, wszystkie działania bez względu na 5 czy 10 zostaną zabite, tj. Ponownie uruchomione. Ponowne uruchomienie spowoduje, że aplikacja rozpocznie się od początku bez zapisanych stanów.
źródło