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 :)