Co się dzieje, gdy przesuwasz aplikację z listy ostatnich aplikacji?


147

Ostatnia lista aplikacji w Ice Cream Sandwich dodała możliwość usuwania aplikacji z listy, tym samym usuwając je na stałe (i o ile wiem, jest to funkcja waniliowa, a nie CM / niestandardowa pamięć ROM). Dokumentacja i najważniejsze informacje o platformie nie wydają się obejmować podstawowych funkcji tej funkcji, ale jestem ciekawy, co tak naprawdę robi system.

Jeszcze bardziej zwiększając moją ciekawość, postanowiłem zrobić szybki test: uruchomiłem Muzykę na instalacji CM9, a potem ją wycofałem. Następnie sprawdziłem listę ostatnich aplikacji i zobaczyłem, że rzeczywiście tam była (i we właściwym stanie, na podstawie miniatury). Następnie wszedłem Settings->Applicationsi wymusiłem zatrzymanie aplikacji Muzyka, ale wciąż była ona wymieniona na ostatniej liście, co doprowadziło mnie do przekonania, że ​​nie jest związana z procesami pozostającymi w tle.

Zdając sobie sprawę, że Muzyka może być złym wyborem, przetestowałem również aplikację USA Today. Wykazało to w zasadzie to samo zachowanie i wydawało się, że zostało zmuszone do „ponownego uruchomienia” po wymuszonym zatrzymaniu (co ma sens), chociaż miniatura na liście ostatnich aplikacji tego nie odzwierciedlała (zgaduję, zgaduję?).

Co się dzieje na poziomie systemu operacyjnego, gdy przesuwasz aplikację poza ostatnią listę? Czy po prostu usuwa dane aplikacji z pamięci RAM i śmieci je zbierają, niszcząc zapisany stan?

Odpowiedzi:


68

Przesuwanie aplikacji z listy ostatnich aplikacji jest waniliowe i tak, nie jest dobrze udokumentowane. To był temat przyzwoitej ilości dyskusji na różnych forach Androida ... konsensus wydaje się najlepiej opisany tutaj w niektórych komentarzach : zachowanie jest podobne, ale nie dokładnie takie samo jak zamknięcie aplikacji - ogólnie ( w przypadku aplikacji, które nie definiują jawnej obsługi przycisku Wstecz), to tak samo, jak cofanie się wystarczająco dużo razy w aplikacji, z której wychodzisz.

Link zawiera więcej szczegółów na temat szczegółów, ale ogólnie można go uznać za zamknięcie aplikacji.

Sądzę, że w przypadku konkretnej aplikacji Muzyka uruchamia usługę, więc chociaż samo zadanie (aplikacja Muzyka / interfejs użytkownika) może zostać zamknięte, usługa nadal działa w tle, dzięki czemu muzyka nie zatrzymuje się nagle tylko z powodu zadania zostało usunięte z powodów zarządzania pamięcią. To mogło mieć wpływ na to, co widziałeś.


1
Dzięki, ten link ma wiele dobrych dyskusji. Być może masz rację: Muzyka, która mogła być kiepskim testem. Spróbuję innej aplikacji, tylko do kopnięć.
eldarerathis

2
Idę dalej i akceptuję to, ponieważ dyskusja reddit pomogła mi znaleźć lepsze wyszukiwane hasła i wydawało się, że zostały potwierdzone przez niektóre posty Dianne Hackborn, które zauważyłem w mojej odpowiedzi . Dzięki!
eldarerathis


1
Perfekcyjnie, dziękuję! Dla mnie ten post pomógł mi: reddit.com/r/Android/comments/mpevh/…
Boris Strandjev

Odtwarzacze muzyczne innych firm, takie jak Rocket Player, zatrzymują odtwarzanie muzyki po przesunięciu aplikacji z listy Ostatnie, nawet jeśli usługa działa w tle i musisz ponownie otworzyć aplikację lub odtworzyć w widżecie, aby rozpocząć odtwarzanie muzyki.
Lucky

78

Wydaje mi się, że znalazłem magiczne wyszukiwane hasła, które doprowadziły do ​​niektórych wyjaśnień od pracowników Google. W szczególności znalazłem kilka różnych miejsc, w których Dianne Hackborn wyjaśnia, co się dzieje, gdy przesuwasz coś z ostatniej listy. Pierwszy to komentarz do jednego z jej wpisów w Google+ :

[W] hat szczególnie zdarza się, gdy przesuwasz ostatnie zadanie, czy to: (1) zabija dowolne tło lub puste procesy aplikacji (patrz http://developer.android.com/guide/topics/fundamentals/processes-and- threads.html # Cykl życia dla tego, co to oznacza), i (2) używa nowego interfejsu API http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) usługi aplikacji dotyczące usuwanego zadania, dzięki czemu może robić, co uzna za stosowne.

W komentarzu na blogu zauważa również :

W rzeczywistości usunięcie wpisu w ostatnich zadaniach spowoduje zabicie wszystkich procesów działających w tle dla tego procesu. Nie spowoduje to bezpośrednio zatrzymania usług, jednak istnieje interfejs API umożliwiający im stwierdzenie, że zadanie zostało usunięte, aby zdecydować, czy chcą to oznaczać, że powinni się zatrzymać. Dzieje się tak, że usunięcie mówi, że ostatnie zadanie aplikacji e-mail nie spowoduje, że przestanie ona sprawdzać pocztę e-mail.

Jeśli naprawdę chcesz całkowicie zatrzymać aplikację, możesz długo nacisnąć ostatnie zadania, aby przejść do informacji o aplikacji i nacisnąć tam siłę stop. Zatrzymanie oznacza całkowite zabicie aplikacji - wszystkie procesy są zabijane, wszystkie usługi zatrzymane, wszystkie powiadomienia usunięte, wszystkie alarmy usunięte itp. Aplikacja nie może zostać uruchomiona ponownie, dopóki nie zostanie wyraźnie o to poproszona.

Wygląda na to, że podsumowanie polega na tym, że przeciągnięcie aplikacji z listy najpierw zabije wszystkie procesy działające w tle, a następnie onTaskRemovedpowiadomi aplikację, że zadanie w tle zostało usunięte. W tym momencie wygląda na to, że to aplikacja musi zdecydować, co się stanie, więc wydaje mi się, że technicznie nie ma twardej i szybkiej reguły dotyczącej tego, co dzieje się z aplikacją poza tym punktem.


To z pewnością nieoczywiste zachowanie, bardzo interesujące!
Mateusz

„zabij wszystkie procesy działające w tle dla tego procesu. Nie spowoduje to bezpośredniego zatrzymania usług”. Czy to nadal prawda? Wczoraj przeprowadziłem test. Wczoraj w głównym procesie usunąłem aplikację z usługą działającą w tle. Aplikacje => działający interfejs użytkownika pokazał 0 procesów i 0 usług. Później usunąłem tę samą aplikację z procesem uruchomionym w osobnym procesie specyficznym dla aplikacji. Aplikacje => z uruchomionym interfejsem użytkownika powiedziały, że mam 0 procesów i 1 usługę. To było na Moto X (2014) z Androidem 4.4.4.
Steven Wexler

@StevenWexler: Możliwe, że usługa zakończyła się sama w pierwszym przypadku, ale nie w drugim, lub może być tak, że w drugim scenariuszu główny proces stwierdził (z jakiegoś powodu), że nie chce zatrzymać usługi. Trudno wiedzieć na pewno.
eldarerathis

uruchomiona usługa uruchamia się ponownie automatycznie po przesunięciu z ostatniej listy, jej onCreate ponownie się wywołuje. ale w niektórych aplikacjach onCreate wywoływał przed onTaskRemoved, aw niektórych wywoływano po onTaskRemoved. dlaczego tak się dzieje?
umesh

21

W kodzie źródłowym znajdują się informacje o klasach com.android.internal.policy.impl.RecentApplicationsBackground i com.android.internal.policy.impl.RecentApplicationsDialog .

Jeśli przeczytam je poprawnie, istnieją specjalne procedury obsługi do wybierania aplikacji, ale nic specjalnego do przesuwania ich, z wyjątkiem tych onDetachedFromWindow(), które wywołują, com.android.View.onDetachedFromWindow()co w zasadzie ukrywa element i usuwa jego dane. Oznaczałoby to, że po przesunięciu aplikacji nie dzieje się nic specjalnego, co odpowiada odpowiedzi Austina Millsa, ponieważ ponieważ lista nie pokazuje aktywnej aplikacji, onPause()i inne wywołania systemowe wykonywane podczas „zamykania” aplikacji mają już się stało.


10

Myślę, że zrobi to tak samo jak przycisk Wstecz. Z wyjątkiem jednej małej zmiany. Będzie to finish()cała aktywność / fragmenty w aplikacji.

Właśnie wykonałem małe testy z małą aplikacją do samodzielnego budowania. Ty też możesz przetestować. Oto moja aplikacja testująca: https://bitbucket.org/Leandros99/lifecycletestest (dostępne także do pobrania. Dla tych, którzy nie mogą budować.)
W każdej metodzie cyklu życia działania ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) wydrukuj dziennik aplikacji. Możesz go wyświetlić za pomocą adb logcat (zainstaluj Android SDK, cd na platformie-narzędziach w cmd / shell i wpisz adb logcat. Teraz zobaczysz, za każdym razem, gdy robisz coś takiego jak przycisk powrotu lub home, aplikacja drukuje wspomnianą powyżej metodę cyklu życia. )

Twoje pytanie: jeśli przeciągnę aplikację z ostatniej szuflady aplikacji, onDestroymetoda zostanie wywołana. Działa prawie tak samo jak przycisk Wstecz.
Mam nadzieję, że trochę pomogłem. Jeśli są pytania, po prostu zapytaj.


3

Zamyka aplikację i jej dane przechowywane w pamięci RAM. Dzięki temu zyskujesz więcej miejsca w pamięci RAM, dzięki czemu możesz uruchamiać inne aplikacje. Jednak usługi w tle NIE są automatycznie wymuszane zamykaniem w wyniku zamknięcia używanej aplikacji.


1
Chociaż napisane w języku codziennym, jest to w rzeczywistości dość dokładna odpowiedź - oddaje fakt, że proces jest usuwany, brakuje czegoś z wielu innych odpowiedzi (tych, które błędnie porównują go do przycisku Wstecz). Brakuje tutaj jednak świadomości, że Android i tak pozbywa się procesów, gdy jest to potrzebne do uzyskania pamięci, więc chociaż wykonuje pewne czyszczenie pamięci, dzieje się to automatycznie, jeśli / w razie potrzeby.
Chris Stratton
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.