Различия между Android, убивающей приложение, и пользователя, отскакивающего его от недавнего списка приложений

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

Обычно onDestroy будет вызываться всякий раз, когда Android принимает активность, чтобы открыть некоторое пространство. Это хорошо в одном из случаев, однако прокрутка приложения из последних списков приложений не вызывает onDestroy и остается липкое уведомление.

То, что я сделал, я внедрил пустую службу, которая заставит onDestroy когда приложение будет убито (как onDestroy так и системное уничтожение), чтобы я мог удалить свое уведомление.

Однако то, что я хотел бы сделать, – это различие между ударами и системным убийством.

Возможно ли это?

В общем, если Android хочет убить ваше приложение, потому что оно слишком давно (или потому, что оно хочет вернуть ресурсы), Android просто просто убьет процесс ОС, принимающий ваше приложение. Он не будет называть onDestroy() finish() или onDestroy() для любых компонентов Activity или Service. Поведение «проведите из списка недавних задач» со временем изменилось и отличается в разных версиях Android. Кто-то должен написать книгу об этом 🙁

Это комментарий, который я нашел в reddit, который мне кажется очень интересным:

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

Используйте ADB для запуска «ps» на устройстве и убедитесь, что запущен процесс com.google.android.browser. Перейдите на главный экран, он все еще работает. Запустите некоторые другие приложения, и процесс com.google.android.browser все еще существует.

Однако проведите его из списка рецензентов, и процесс исчез. Вы можете создать тестовое приложение для дальнейшей проверки и зарегистрировать вызов onDestroy () в своей деятельности. Он не вызывается, когда вы возвращаетесь или возвращаетесь домой из приложения, или когда вы запускаете другие приложения. Это вызвано, когда вы удаляете приложение из списка рецензентов. Я согласен с тем, что список последних приложений на самом деле не «многозадачный».

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

Это еще один хороший ответ о том, что произойдет, когда вы проведете приложение из списка последних приложений. Но то, что мне больше всего понравилось, было:

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

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

С помощью Swiping из недавнего списка задач удаляется только из недавних задач. Он также назывался onDestroy до android 5.0. Возможно, у вас проблема с устройствами уровня api 20 уровня. Системное убийство обычно не может быть выполнено в нормальном жизненном цикле активности Android. Он просто заканчивает работу на заднем пресс-мероприятии.

При прокручивании приложения налево, если какой-либо поток по-прежнему работает в вашем приложении. Прерывание, но служба не остановлена, когда вы убиваете удобное приложение. Тема и службы останавливаются.

Поведение аналогично, но не совсем точно так же, как закрытие приложения – в целом (для приложений, которые не определяют явное обратное управление кнопками) это то же самое, что ударять достаточно назад из приложения, которое вы выходите из него , Ознакомьтесь с этой ссылкой, у нее есть хороший вклад в тему

Во-первых, давайте onDestroy() одно: Android МОЖЕТ НЕ onDestroy() . Ссылаясь на страницу активности , начиная с Honeycomb, onPause() и onStop() гарантированно вызывается до того, как приложение будет убито.

Имейте в виду, что эта семантика немного изменится между приложениями, ориентированными на платформы, начиная с HONEYCOMB и с таргетинга на предыдущие платформы. Начиная с Honeycomb, приложение не находится в состоянии killable, пока не вернется его onStop (). Это влияет на то, когда onSaveInstanceState (Bundle) может быть вызван (его можно безопасно вызывать после onPause (), и позволяет и приложение безопасно ждать, пока onStop () сохранит постоянное состояние.

Поэтому после того, как (надеюсь), очистив эфир от жизненного цикла Android, я думаю, вы можете добиться того, чего хотите, onStop() вместо этого уведомление об удалении кода в onStop() . Если вам это нужно, потому что пользователь действительно возвращается к конкретному Actvitiy (IE не убит), вы можете вернуть его в onRestart() .

Вы можете проверить, когда пользователь замалчивает приложение, добавив службу в ваше приложение и onTaskRemoved метод onTaskRemoved : https://stackoverflow.com/a/26882533/2441655