Если мое приложение запущено, и я нажимаю кнопку «Домой», приложение переходит в фоновый режим. Теперь , если длительное нажатие на кнопку домой и убить приложение, ударяя его из списка последних приложений, ни одно из событий не нравится onPause()
, onStop()
или onDestroy()
вызывается , а процесс завершается. Итак, если я хочу, чтобы мои службы остановились, отключили уведомления и отменили регистрацию слушателей, как я могу это сделать? Я прочитал довольно много статей и блогов, но не получил никакой полезной информации и не нашел никакой документации по этому поводу. Любая помощь будет оценена. Заранее спасибо.
105
Ответы:
Я только что решил подобную проблему.
Вот что вы можете сделать, если просто остановите службу, когда приложение будет убито, проведя пальцем по списку последних приложений.
Внутри вашего файла манифеста оставьте флаг
stopWithTask
какtrue
для службы. Подобно:Но поскольку вы говорите, что хотите отменить регистрацию слушателей и остановить уведомление и т. Д., Я бы предложил такой подход:
Внутри вашего файла манифеста оставьте флаг
stopWithTask
какfalse
для службы. Подобно:Теперь к вашим
MyService
услугам метод переопределенияonTaskRemoved
. (Это будет срабатывать, только еслиstopWithTask
установлено значениеfalse
).Обратитесь к моему вопросу для получения более подробной информации, который также содержит другую часть кода.
Надеюсь это поможет.
источник
Нашел один способ сделать это
сделай одну такую услугу
}
2) зарегистрируйте эту службу в manifest.xml
3) Затем запустите эту службу в своей заставке.
И теперь всякий раз, когда вы очистите свое приложение от Android, этот метод onTaskRemoved () будет выполняться.
источник
Решил аналогичную проблему. Если вы хотите, чтобы после перехода от недавней задачи и при следующем запуске она работала правильно, выполните следующие действия: -
1) Сохраните идентификатор процесса в общих настройках:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2) Когда приложение запускается из панели запуска после удаления из недавней задачи, выполните:
источник
Когда вы нажимаете домой -
onPause
иonStop
вызывается ваша Activity, поэтому в это время вам нужно сделать все сбережения и очистку, потому что платформа Android не гарантирует, чтоonDestroy
будет вызван этот или любой другой метод жизненного цикла, поэтому процесс может быть остановлен без уведомления.источник
onPause()
иonstop()
их нужно убивать только тогда, когда пользователь выходит из приложения, то есть выходит из системы.Вам нужно сохранить свои данные, когда
onPause()
вызывается. Взгляните на эту диаграмму жизненного цикла: Android DeveloperВы можете видеть, что приложение можно убить после
onPause()
илиonStop()
.Храните там свои данные и восстанавливайте их в
onRestart()
\onCreate()
.удачи!
источник
Вы не можете обрабатывать смахивание, потому что система просто удаляет ваш процесс из памяти, не вызывая никакого обратного вызова.
Я проверил, что перед тем, как пользователь вызовет экран «Недавние приложения», всегда будет вызываться onPause (). Поэтому вам нужно сохранить все данные в методе onPause, не проверяя isFinishing ().
Чтобы проверить кнопку возврата, используйте метод onBackPressed.
источник
ViewModel.onCleared () может быть полезен, если цель состоит в том, чтобы освободить некоторый ресурс (возможно, систему, работающую где-то еще в сети), когда пользователь выполняет неожиданный выход, проводя пальцем по экрану, а не нажимая кнопку «стоп» или кнопку. [Так я изначально пришел к этому вопросу].
Приложение не получает уведомления, и Activity.onDestroy () вызывается для изменений конфигурации, таких как изменение ориентации, поэтому ответа нет. Но ViewModel.onCleared вызывается, когда приложение удаляется (а также когда пользователь отказывается от активности). Если ресурс, который вы хотите использовать, связан с более чем одним действием в стеке, вы можете добавить счетчики ссылок или какой-либо другой механизм, чтобы решить, следует ли ViewModel.onClear освободить ресурс.
Это еще одна из многих веских причин использовать ViewModel.
- Боб
источник
Я действительно не знаю, почему вышеупомянутые подходы не работают в моем случае, даже если я установил,
android:stopWithTask="false"
что онonTaskRemoved()
не вызывается.Другой хороший подход - использовать
AndroidViewModel
. Это работает даже в случае, когда пользователь выходит из приложения, нажав кнопку возврата.Просто привяжите
ViewModel
класс к своему, аMainActivity
затем выполнитеonCleared()
обратный вызов задачи .Пример:
затем привяжите его к своей MainActivity:
~ Вуаля!
источник
Это сработало для меня на android 6,7,8,9.
Сделайте одну такую услугу:
2) Зарегистрируйте эту услугу в
manifest.xml
:3) Затем запустите эту службу в своей заставке.
источник
Как упомянул Боб Крам в своем ответе, ответом является метод onCleared () модели View . Работает в обоих случаях:
OnTaskRemoved () службы будет работать, когда пользователь проведет пальцем по приложению из фона, но не будет работать, когда приложения будут очищены с помощью кнопки «убить все».
Но метод onCleared () viewModel работает в обоих случаях. Вы можете использовать if, чтобы остановить любой текущий процесс или очистить любую задачу на удаленном сервере.
источник