Что на самом деле происходит, когда вы удаляете приложение из списка последних приложений?

147

В недавнем списке приложений в Ice Cream Sandwich добавлена ​​возможность смахивать приложения из списка, тем самым навсегда их исключая (и, насколько я знаю, это функция vanilla, а не функция CM / custom ROM). Документация и основные сведения о платформе, по-видимому, не охватывают скрытую работу этой функции, но мне любопытно узнать, что на самом деле делает система.

Вдобавок к своему любопытству, я решил провести быстрый тест: я запустил Music на установке CM9, а затем отказался от нее. Затем я проверил список последних приложений и увидел, что он действительно есть (и в правильном состоянии, в зависимости от миниатюры). Затем я вошел Settings->Applicationsи принудительно остановил приложение «Музыка», но оно все еще было включено в недавний список, что заставило меня поверить, что оно не связано с процессами, происходящими в фоновом режиме.

Понимая, что музыка, возможно, была неудачным выбором, я также протестировал приложение USA Today. Это демонстрировало в основном то же самое поведение, и казалось, что оно было вынуждено «перезапустить» после принудительной остановки (что имеет смысл), хотя миниатюра в списке последних приложений не отражала это (кешируется, я полагаю?).

Итак, что же на самом деле происходит на уровне ОС, когда вы удаляете приложение из недавнего списка? Он просто удаляет данные приложения из ОЗУ и собирает их мусором, разрушая его сохраненное состояние?

eldarerathis
источник

Ответы:

68

Удалять приложения из списка последних приложений - ванильно, и да, плохо документировано. Это было предметом пристального обсуждения на различных форумах Android ... консенсус лучше всего описать здесь в некоторых комментариях : поведение похоже на закрытие приложения, но не совсем то же самое (в общем ( для приложений, которые не определяют явную обработку кнопки «назад»), это то же самое, что отбрасывать достаточное количество раз из приложения, из которого вы выходите.

Ссылка содержит более подробную информацию о специфике, но в целом вы можете думать о ней как о выходе из приложения.

Я полагаю, что для приложения «Музыка» запускается служба, поэтому, хотя само задание (приложение «Музыка» / пользовательский интерфейс) может быть закрыто, служба продолжает работать в фоновом режиме, так что ваша музыка не останавливается внезапно только потому, что задача был очищен по причинам управления памятью. Это могло повлиять на то, что вы видели.

Остин Миллс
источник
1
Спасибо, эта ссылка имеет много хорошего обсуждения. Вы также можете быть правы в отношении музыки, которая, возможно, была плохим тестом. Я попробую другое приложение, только для удовольствия.
eldarerathis
2
Собираюсь пойти дальше и принять это, так как обсуждение Reddit помогло мне найти некоторые лучшие поисковые термины, и, кажется, было подтверждено некоторыми сообщениями Дайан Хэкборн, которые я отметил в своем ответе . Спасибо!
eldarerathis
1
Отлично спасибо! Для меня этот пост помог мне: reddit.com/r/Android/comments/mpevh/…
Борис Странджев
Музыкальные проигрыватели сторонних производителей, такие как Rocket Player, останавливают музыку, когда вы проводите приложение из списка «Последние», даже если служба работает в фоновом режиме, и вам нужно снова открыть приложение или воспроизвести в виджете, чтобы запустить музыку.
Счастливчик
78

Кажется, я нашел волшебные поисковые термины, которые привели к некоторым объяснениям от сотрудников Google. В частности, я нашел пару разных мест, где Дайан Хэкборн объясняет, что происходит, когда вы удаляете что-то из недавнего списка. Первый комментарий к одному из ее постов в Google+ :

[W], в частности, случается, когда вы удаляете последнюю задачу, если это: (1) убивает любые фоновые или пустые процессы приложения (см. Http://developer.android.com/guide/topics/fundamentals/processes-and- threads.html # Жизненный цикл того, что это значит), и (2) использует новый http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API, чтобы сообщить любому Службы приложения об удалении задачи, чтобы оно могло делать все, что считает нужным.

Она также отмечает в комментарии в блоге :

Фактически, удаление записи в недавних задачах уничтожит все фоновые процессы, которые существуют для процесса. Это не приведет к немедленной остановке служб, однако для них существует API, позволяющий узнать, была ли удалена задача, чтобы решить, хотят ли они, чтобы это означало, что они должны остановиться. Это связано с тем, что удаление, скажем, недавней задачи приложения электронной почты не приведет к остановке проверки электронной почты.

Если вы действительно хотите полностью остановить приложение, вы можете долго нажимать на недавние задачи, чтобы перейти к информации о приложении, и нажать «Force stop» на этом. Ибо остановка - это полное уничтожение приложения - все процессы уничтожены, все службы остановлены, все уведомления удалены, все тревоги удалены и т. Д. При повторном запросе приложению не разрешается запускаться снова.

Итак, похоже, что сводка заключается в том, что удаление приложения из списка сначала уничтожит все фоновые процессы для приложения, а затем используется onTaskRemovedдля уведомления приложения о том, что фоновая задача была удалена. В этот момент кажется, что приложение должно решить, что произойдет, поэтому я думаю, что технически нет строгого правила о том, что происходит с приложением после этого момента.

eldarerathis
источник
Это, конечно, неочевидное поведение, очень интересное!
Мэтью Читал
msgstr "убить любые фоновые процессы, которые существуют для процесса. Это не приведет к немедленной остановке служб". Это все еще правда? Я провел тест вчера. Вчера я ударил приложение с фоновым сервисом в основном процессе. Пользовательский интерфейс apps => показал 0 процессов и 0 сервисов. Позже я удалил то же приложение с процессом, работающим в отдельном процессе, специфичном для приложения. Пользовательский интерфейс apps => сказал, что у меня 0 процессов и 1 служба. Это было на Moto X (2014) с Android 4.4.4.
Стивен Векслер
@StevenWexler: Может случиться так, что служба закончилась самостоятельно в первом случае, но не во втором, или во втором сценарии основной процесс определил (по какой-то причине), что он не хочет останавливать службу. Трудно знать наверняка.
eldarerathis
Запущенный сервис снова запускается автоматически после того, как он был удален из недавнего списка, и снова вызван onCreate. но в некоторых приложениях onCreate вызывается до onTaskRemoved, а в некоторых его вызывается после onTaskRemoved. почему такое поведение то?
Умеш
21

В исходном коде есть некоторая информация в классах com.android.internal.policy.impl.RecentApplicationsBackground и com.android.internal.policy.impl.RecentApplicationsDialog .

Если я правильно их прочитал, есть определенные обработчики для выбора приложений, но нет ничего особенного для их смахивания, кроме тех onDetachedFromWindow(), которые вызывают, com.android.View.onDetachedFromWindow()что в основном скрывает элемент и очищает его данные. Это намекает на то, что при перелистывании приложения ничего особенного не происходит, что соответствует ответу Остина Миллса, поскольку, поскольку в списке не отображается активное приложение, onPause()и другие системные вызовы, которые выполняются при «выходе» из приложения, имеют уже случилось.

Оник
источник
10

Я думаю, что он будет делать то же самое, что и кнопка "Назад". За исключением одного небольшого изменения. Это будет finish()все действия / фрагменты в приложении.

Просто провел небольшое тестирование с небольшим приложением для самостоятельной сборки. Вы тоже можете проверить. Вот мое приложение для тестирования: https://bitbucket.org/Leandros99/lifecycletest (также доступна для скачивания. Для тех, кто не может собрать.)
В каждом методе жизненного цикла Activity ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) распечатать приложение в журнале. Вы можете просмотреть его с помощью adb logcat (установите Android SDK, перейдите к инструментам платформы в cmd / shell и наберите текст adb logcat. Теперь вы увидите, что каждый раз, когда вы делаете что-то вроде нажатия кнопки «назад» или «home», приложение печатает метод жизненного цикла, упомянутый выше. )

Ваш вопрос: если я проведу пальцем по приложению из панели недавних приложений, onDestroyбудет вызван метод. Это делает почти так же, как кнопка возврата.
Надеюсь, я немного помог. Если есть вопросы, просто спросите.

Leandros
источник
3

Он закрывает приложение и его данные, которые хранятся в оперативной памяти. Таким образом, давая вам больше места в оперативной памяти, чтобы вы могли запускать другие приложения. Однако фоновые сервисы НЕ закрываются автоматически из-за закрытия используемого приложения.

user3067986
источник
1
Хотя он написан на обычном языке, на самом деле это довольно точный ответ - он отражает тот факт, что процесс утилизирован, но многие другие ответы (те, которые ошибочно сравнивают его с кнопкой «Назад») отсутствуют. Однако здесь не хватает понимания того, что Android все равно будет распоряжаться процессами, когда это необходимо для получения памяти, поэтому, хотя и выполняет некоторую очистку памяти, это происходит автоматически, если / когда это необходимо.
Крис Страттон