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

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

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

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

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

139 голосов | спросил eldarerathis 28 FebruaryEurope/MoscowbTue, 28 Feb 2012 00:47:55 +0400000000amTue, 28 Feb 2012 00:47:55 +040012 2012, 00:47:55

5 ответов


64

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

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

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

ответил Austin Mills 28 FebruaryEurope/MoscowbTue, 28 Feb 2012 04:21:17 +0400000000amTue, 28 Feb 2012 04:21:17 +040012 2012, 04:21:17
74

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

  

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

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

  

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

     

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

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

ответил eldarerathis 16 MaramFri, 16 Mar 2012 04:58:16 +04002012-03-16T04:58:16+04:0004 2012, 04:58:16
18

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

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

ответил onik 10 MarpmSat, 10 Mar 2012 13:13:30 +04002012-03-10T13:13:30+04:0001 2012, 13:13:30
10

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

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

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

ответил Leandros 15 MarpmThu, 15 Mar 2012 23:47:37 +04002012-03-15T23:47:37+04:0011 2012, 23:47:37
3

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

ответил user3067986 5 ThuEurope/Moscow2013-12-05T03:22:25+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 03:22:25 +0400 2013, 03:22:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132