Що насправді відбувається, коли ви проведіть додаток зі списку останніх додатків?


147

Недавній список програм у сендвіч-морозиві додав можливість викреслювати додатки зі списку, тим самим відкидаючи їх назавжди (і наскільки я знаю, це функція ванілі, а не CM / користувальницький ПЗУ). Основні відомості про документацію та платформу не висвітлюють роботу цієї функціональності під кришкою капота, але мені цікаво дізнатися, чим насправді займається система.

Далі додавши моєї цікавості, я вирішив зробити швидкий тест: я запустив «Музику» на встановлення CM9, а потім вийшов з нього. Потім я перевірив список останніх програм і побачив, що він дійсно є (і в належному стані, спираючись на ескіз). Потім я ввійшов у Settings->Applicationsдію і змусив зупинити додаток "Музика", але він все ще був вказаний у списку останніх днів, і це змусило мене повірити, що воно не пов'язане з процесами, що тривають у фоновому режимі.

Зрозумівши зараз, що музика, можливо, був поганим вибором, я також перевірив програму USA Today. Це в основному та ж поведінка, і здавалося, що він був змушений "відновитись" після зупинки (що має сенс), хоча ескіз у списку останніх програм цього не відображав (кешований, я гадаю?).

Отже, що насправді відбувається на рівні ОС, коли ви проведіть додаток із останнього списку? Чи просто очищає дані програми з оперативної пам’яті, а сміття збирає їх, знищуючи збережений стан?

Відповіді:


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/process-and- thread.html # Життєвий цикл для того, що це означає) та (2) використовує новий http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API, щоб повідомити будь-який послуги програми щодо завдання, яке видаляється, щоб воно могло робити все, що вважає за потрібне.

Вона також зазначає у коментарі до свого блогу :

Насправді, видалення запису в останніх завданнях знищить усі фонові процеси, які існують для цього процесу. Це не призводить до прямої зупинки служб, однак для них є API, щоб дізнатися, чи було видалено завдання, щоб вирішити, чи хочуть вони це означати, що вони повинні зупинитись. Це так, що, скасувавши, скажімо, нещодавнє завдання програми електронної пошти не призведе до того, що він не зупинить перевірку електронної пошти.

Якщо ви дійсно хочете повністю зупинити додаток, ви можете довго натискати на останні завдання, щоб перейти до інформації про додаток, і натисніть примусово зупинитись. Для зупинки - це повне вбивство програми - усі процеси вбиваються, всі сервіси припиняються, усі сповіщення видаляються, усі тривоги видаляються і т. Д. Додаток забороняється запускати ще раз, поки явно не вимагається.

Таким чином, схоже, що резюме полягає в тому, що витягнення програми зі списку спочатку знищить усі фонові процеси для програми, а потім використовуватиме onTaskRemovedповідомлення про програму, що фонове завдання було видалено. У цей момент схоже, що додаток вирішує, що трапиться, саме на додаток, тому я думаю, технічно не існує жорсткого правила щодо того, що відбувається з додатком після цієї точки.


Це звичайно неочевидна поведінка, дуже цікаво!
Матвій

"знищити будь-які фонові процеси, які існують для цього процесу. Це не призведе до прямої зупинки служб". Це все-таки правда? Я вчора пройшов тест. Вчора я перенесла додаток із фоновою службою в основному процесі. У API => працює інтерфейс користувача було показано 0 процесів і 0 служб. Пізніше я скачав одне і те саме додаток із процесом, який запускався в окремому конкретному додатку. У програмах => працює інтерфейс користувача сказано, що у мене 0 процесів і 1 сервіс. Це було на Moto X (2014) з Android 4.4.4.
Стівен Векслер

@StevenWexler: Можливо, сервіс закінчився самостійно у першому випадку, але не у другому, або у другому сценарії основний процес визначив (чомусь), що він не хотів припиняти послугу. Важко знати напевно.
eldarerathis

запущена послуга запускається автоматично знову після виходу зі списку останніх днів, її onCreate викликається знову. але в деяких додатках onCreate викликається раніше onTaskRemoved, а в деяких - onTaskRemoved. чому така поведінка тоді?
umesh

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 (також доступне завантаження. Для тих, хто не може побудувати.)
У кожному способі життєвого циклу діяльності ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) друкує додаток журнал. Ви можете переглянути його за допомогою adb logcat (встановіть Android SDK, CD для платформних інструментів у cmd / shell та введіть adb logcat. Тепер ви побачите, щоразу, коли ви робите щось, як натиснути кнопку назад або додому, додаток друкує згаданий вище метод життєвого циклу. )

Ваше запитання: Якщо я проведу додаток із ящика останніх додатків, onDestroyметод буде викликаний. Це майже так само, як кнопка "назад".
Сподіваюся, я трохи допоміг. Якщо є питання, просто запитайте.


3

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


1
Хоча це написано повсякденною мовою, це насправді досить точна відповідь - він фіксує той факт, що процес утилізується, чогось багато інших відповідей (тих, хто помилково порівнює його із кнопкою "назад") не вистачає. Однак тут бракує усвідомлення того, що Android все одно розпоряджатиметься процесами, коли це потрібно для отримання пам'яті, тому, хоча воно виконує деяке очищення пам'яті, це відбудеться автоматично, якщо / коли це буде потрібно.
Кріс Страттон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.