Подтвердить что ты не робот

Изменение динамических разрешений в Android-маркерах убивает все процессы приложений

Наблюдение. Вручное изменение приложения Android убило все процессы для этого приложения.

Процедура: перейдите в Настройки- > Приложения Выбрать приложение и Разрешения. Отключите одно из разрешений. Устройство: устройство Nexus 6, работающее под управлением Android Marshmallow 6.0.

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

Это ожидаемое поведение с динамическими разрешениями на всех устройствах Android 6.0+? Почему существует разница в поведении, когда процесс приложения убит, вытаскивая его из многозадачного меню пользовательского интерфейса?

4b9b3361

Ответ 1

То есть, чтобы приложение корректно работало при запуске после изменения разрешения, оно не может быть связано с запуском активности запуска.

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

Это ожидаемое поведение с динамическими разрешениями на всех устройствах Android 6.0+?

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

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

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

Ответ 2

Я предполагаю, что причиной убийства является следующее. Это около concurrency. Система может выбрать один из трех возможных подходов:

  • Чтобы отменить разрешение молча. Приложение не имеет возможности проверить это, потому что между любыми моментами "проверка" и "использование" может произойти отмена.

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

  • Чтобы убить приложение, убедитесь, что при следующем запуске он правильно поймет, что разрешение было отменено.