Спящий режим приложения

Если ваше приложение предназначено для Android 11 (API уровня 30) или выше, и пользователь не взаимодействует с вашим приложением в течение нескольких месяцев, система переводит ваше приложение в состояние гибернации . Система оптимизирует дисковое пространство вместо производительности и защищает пользовательские данные. Такое поведение системы похоже на то, что происходит, когда пользователь вручную принудительно останавливает ваше приложение из системных настроек.

Эффекты спячки

Как показано в таблице 1, эффекты спящего режима зависят от целевой версии SDK вашего приложения, а также от устройства, на котором работает ваше приложение:

Таблица 1. Влияние спящего режима на ваше приложение
Целевая версия SDK Характеристики устройства Эффекты гибернации
Android 12 или выше Работает на Android 12 или выше

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

Ваше приложение не может запускать задания или оповещения в фоновом режиме.

Ваше приложение не может получать push-уведомления, включая высокоприоритетные сообщения, отправляемые через Firebase Cloud Messaging .

Все файлы в кэше вашего приложения удаляются.

Андроид 11 Работает на Android 11 Разрешения времени выполнения вашего приложения сбрасываются.
Андроид 11 Работает на Android 6.0 (уровень API 23) по Android 10 (уровень API 29) включительно и использует сервисы Google Play.

Разрешения времени выполнения вашего приложения сбрасываются.

Такое поведение вступит в силу в декабре 2021 года. Узнайте больше в этой записи блога о том, как сделать автоматический сброс разрешений доступным для миллиардов дополнительных устройств .

Поведение системы при выходе приложения из спящего режима

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

Однако система не делает для вашего приложения следующее:

  1. Повторно предоставьте разрешения на выполнение вашего приложения.

    Пользователь должен повторно предоставить эти разрешения для вашего приложения.

  2. Перепланируйте все задания, оповещения и уведомления, которые были запланированы до перехода приложения в режим гибернации.

    Для более простой поддержки этого рабочего процесса используйте WorkManager . Вы также можете добавить логику перепланирования в широковещательном приемнике ACTION_BOOT_COMPLETED , который вызывается, когда ваше приложение выходит из спящего режима и после загрузки устройства.

Использование приложения

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

Примеры использования приложения

Когда активность в вашем приложении возобновляется, система считает это событие взаимодействием с пользователем. Поэтому система увеличивает время, по истечении которого ваше приложение перейдет в спящий режим.

На устройствах Android 11 и выше следующие действия также считаются взаимодействием с пользователем:

  • Пользователь взаимодействует с виджетом .
  • Пользователь взаимодействует с уведомлением, за исключением его отклонения.

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

  • Приложения, которые имеют поставщика услуг или контента, привязанного к другому приложению на устройстве или ОС. Например, редакторы методов ввода (IME) или менеджеры паролей.
  • Приемники вещания в пакете, получающие явную трансляцию из внешнего пакета.

Не примеры

Если ваше приложение всегда демонстрирует поведение, описанное в следующем списке, оно перейдет в спящий режим через несколько месяцев:

Системные исключения из спящего режима

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

Приложения не отображаются на панели запуска
Любое приложение, не имеющее активной плитки ярлыка на панели запуска.
Приложения рабочего профиля
Любое приложение, которое пользователь устанавливает в рабочем профиле . Обратите внимание, что если то же самое приложение также находится в личном профиле, то освобождение распространяется только на приложение рабочего профиля.
Контроллеры политики устройств
Приложения, управляющие локальными политиками устройств и системными приложениями на устройствах.
Привилегированные приложения оператора
Любое приложение, которое операторы мобильной связи предварительно загружают на устройства и считают необходимым для выполнения договорных обязательств по обслуживанию, например, приложения голосовой почты или обслуживания клиентов.
3p установщик приложений
Сторонние магазины приложений для автоматического обновления установленных приложений при необходимости.

Исключения пользователей из режима гибернации

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

  • Обеспечьте безопасность семьи, периодически сообщая о местонахождении членов семьи.
  • Синхронизируйте данные между устройством и сервером вашего приложения.
  • Общайтесь с помощью смарт-устройств, таких как телевизор.
  • Подключитесь к сопутствующим устройствам, например, часам.

Чтобы запросить освобождение, выполните действия, описанные в следующих разделах.

Проверьте, отключил ли пользователь уже режим гибернации для вашего приложения.

Чтобы проверить, отключил ли пользователь режим гибернации для вашего приложения, используйте API getUnusedAppRestrictionsStatus() .

Дополнительные сведения об использовании этого API в вашем приложении см. в примере кода API на этой странице.

Попросите пользователя отключить режим гибернации для вашего приложения.

Если пользователь еще не отключил спящий режим для вашего приложения, вы можете отправить запрос пользователю. Для этого выполните следующие действия:

  1. Отобразите пользовательский интерфейс, который объясняет пользователю, почему ему необходимо отключить режим гибернации для вашего приложения.
  2. Вызовите API createManageUnusedAppRestrictionsIntent() , как показано в примере кода API . Этот API создает намерение, которое загружает экран информации о приложении в настройках. Отсюда пользователь может отключить спящий режим для вашего приложения.

    При отправке этого намерения важно вызвать startActivityForResult() , а не startActivity() .

    Как показано в таблице 2, расположение и название параметра зависят от характеристик устройства, на котором установлено ваше приложение:

    Таблица 2. Параметр, отключающий спящий режим для вашего приложения
    Характеристики устройства Страница, где отображается опция Название опции для отключения
    Работает на Android 13 или выше Информация о приложении Приостановить работу приложения, если оно не используется
    Работает на Android 12 Информация о приложении Удалить разрешения и освободить место
    Работает на Android 11 Информация о приложении > Разрешения Удалите разрешения, если приложение не используется
    Работает на Android 6.0 - Android 10 включительно и использует сервисы Google Play. Приложение Play > Меню > Play Protect > Разрешения для неиспользуемых приложений Удалите разрешения, если приложение не используется

Пример кода API

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

Котлин

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

API устаревшей платформы

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

Если вам необходимо временно продолжить использование API в целях совместимости, следующий список показывает, как его использовать:

  • Чтобы проверить, отключен ли режим гибернации для вашего приложения: isAutoRevokeWhitelisted()
  • Чтобы отправить пользователя на страницу настроек спящего режима: создайте Intent с помощью ACTION_APPLICATION_DETAILS_SETTINGS

Вручную активируйте режим гибернации

Чтобы проверить, как ведет себя ваше приложение после того, как система переведет его в состояние гибернации, выполните следующие действия:

  1. (Только для Android 12 и выше) Включите режим гибернации на вашем устройстве:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Установите время по умолчанию, которое система ждет, чтобы перейти в спящий режим. Таким образом, вы сможете восстановить его после тестирования:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Сократите время ожидания системы. В следующем примере система изменена таким образом, что ваше приложение переходит в спящий режим всего через одну секунду после того, как вы прекращаете взаимодействовать с приложением:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Дождитесь завершения всех загрузочных трансляций на тестовом устройстве, выполнив следующую команду:

    adb shell am wait-for-broadcast-idle
    

    Когда трансляции завершены, эта команда возвращает сообщение: All broadcast queues are idle!

  5. Вызовите процесс гибернации приложения вручную:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Только для Android 12 и выше) Убедитесь, что приложение находится в режиме гибернации, используя один из следующих методов:

    • Обратите внимание, что на тестовом устройстве теперь отображается уведомление, указывающее на то, что неиспользуемые приложения переведены в режим гибернации.
    • Выполните следующую команду:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Восстановите время ожидания по умолчанию, которое система выжидает, прежде чем перевести приложение в режим гибернации:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold
    
,

Если ваше приложение предназначено для Android 11 (API уровня 30) или выше, и пользователь не взаимодействует с вашим приложением в течение нескольких месяцев, система переводит ваше приложение в состояние гибернации . Система оптимизирует дисковое пространство вместо производительности и защищает пользовательские данные. Такое поведение системы похоже на то, что происходит, когда пользователь вручную принудительно останавливает ваше приложение из системных настроек.

Эффекты спячки

Как показано в таблице 1, эффекты спящего режима зависят от целевой версии SDK вашего приложения, а также от устройства, на котором работает ваше приложение:

Таблица 1. Влияние спящего режима на ваше приложение
Целевая версия SDK Характеристики устройства Эффекты гибернации
Android 12 или выше Работает на Android 12 или выше

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

Ваше приложение не может запускать задания или оповещения в фоновом режиме.

Ваше приложение не может получать push-уведомления, включая высокоприоритетные сообщения, отправляемые через Firebase Cloud Messaging .

Все файлы в кэше вашего приложения удаляются.

Андроид 11 Работает на Android 11 Разрешения времени выполнения вашего приложения сбрасываются.
Андроид 11 Работает на Android 6.0 (уровень API 23) по Android 10 (уровень API 29) включительно и использует сервисы Google Play.

Разрешения времени выполнения вашего приложения сбрасываются.

Такое поведение вступит в силу в декабре 2021 года. Узнайте больше в этой записи блога о том, как сделать автоматический сброс разрешений доступным для миллиардов дополнительных устройств .

Поведение системы при выходе приложения из спящего режима

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

Однако система не делает для вашего приложения следующее:

  1. Повторно предоставьте разрешения на выполнение вашего приложения.

    Пользователь должен повторно предоставить эти разрешения для вашего приложения.

  2. Перепланируйте все задания, оповещения и уведомления, которые были запланированы до перехода приложения в режим гибернации.

    Для более простой поддержки этого рабочего процесса используйте WorkManager . Вы также можете добавить логику перепланирования в широковещательном приемнике ACTION_BOOT_COMPLETED , который вызывается, когда ваше приложение выходит из спящего режима и после загрузки устройства.

Использование приложения

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

Примеры использования приложения

Когда активность в вашем приложении возобновляется, система считает это событие взаимодействием с пользователем. Поэтому система увеличивает время, по истечении которого ваше приложение перейдет в спящий режим.

На устройствах Android 11 и выше следующие действия также считаются взаимодействием с пользователем:

  • Пользователь взаимодействует с виджетом .
  • Пользователь взаимодействует с уведомлением, за исключением его отклонения.

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

  • Приложения, которые имеют поставщика услуг или контента, привязанного к другому приложению на устройстве или ОС. Например, редакторы методов ввода (IME) или менеджеры паролей.
  • Приемники вещания в пакете, получающие явную трансляцию из внешнего пакета.

Не примеры

Если ваше приложение всегда демонстрирует поведение, описанное в следующем списке, оно перейдет в спящий режим через несколько месяцев:

Системные исключения из спящего режима

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

Приложения не отображаются на панели запуска
Любое приложение, не имеющее активной плитки ярлыка на панели запуска.
Приложения рабочего профиля
Любое приложение, которое пользователь устанавливает в рабочем профиле . Обратите внимание, что если то же самое приложение также находится в личном профиле, то освобождение распространяется только на приложение рабочего профиля.
Контроллеры политики устройств
Приложения, управляющие локальными политиками устройств и системными приложениями на устройствах.
Привилегированные приложения оператора
Любое приложение, которое операторы мобильной связи предварительно загружают на устройства и считают необходимым для выполнения договорных обязательств по обслуживанию, например, приложения голосовой почты или обслуживания клиентов.
3p установщик приложений
Сторонние магазины приложений для автоматического обновления установленных приложений при необходимости.

Исключения пользователей из режима гибернации

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

  • Обеспечьте безопасность семьи, периодически сообщая о местонахождении членов семьи.
  • Синхронизируйте данные между устройством и сервером вашего приложения.
  • Общайтесь с помощью смарт-устройств, таких как телевизор.
  • Подключитесь к сопутствующим устройствам, например, часам.

Чтобы запросить освобождение, выполните действия, описанные в следующих разделах.

Проверьте, отключил ли пользователь уже режим гибернации для вашего приложения.

Чтобы проверить, отключил ли пользователь режим гибернации для вашего приложения, используйте API getUnusedAppRestrictionsStatus() .

Дополнительные сведения об использовании этого API в вашем приложении см. в примере кода API на этой странице.

Попросите пользователя отключить режим гибернации для вашего приложения.

Если пользователь еще не отключил спящий режим для вашего приложения, вы можете отправить запрос пользователю. Для этого выполните следующие действия:

  1. Отобразите пользовательский интерфейс, который объясняет пользователю, почему ему необходимо отключить режим гибернации для вашего приложения.
  2. Вызовите API createManageUnusedAppRestrictionsIntent() , как показано в примере кода API . Этот API создает намерение, которое загружает экран информации о приложении в настройках. Отсюда пользователь может отключить спящий режим для вашего приложения.

    При отправке этого намерения важно вызвать startActivityForResult() , а не startActivity() .

    Как показано в таблице 2, расположение и название параметра зависят от характеристик устройства, на котором установлено ваше приложение:

    Таблица 2. Параметр, отключающий спящий режим для вашего приложения
    Характеристики устройства Страница, где отображается опция Название опции для отключения
    Работает на Android 13 или выше Информация о приложении Приостановить работу приложения, если оно не используется
    Работает на Android 12 Информация о приложении Удалить разрешения и освободить место
    Работает на Android 11 Информация о приложении > Разрешения Удалите разрешения, если приложение не используется
    Работает на Android 6.0 - Android 10 включительно и использует сервисы Google Play. Приложение Play > Меню > Play Protect > Разрешения для неиспользуемых приложений Удалите разрешения, если приложение не используется

Пример кода API

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

Котлин

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

API устаревшей платформы

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

Если вам необходимо временно продолжить использование API в целях совместимости, следующий список показывает, как его использовать:

  • Чтобы проверить, отключен ли режим гибернации для вашего приложения: isAutoRevokeWhitelisted()
  • Чтобы отправить пользователя на страницу настроек спящего режима: создайте Intent с помощью ACTION_APPLICATION_DETAILS_SETTINGS

Вручную активируйте режим гибернации

Чтобы проверить, как ведет себя ваше приложение после того, как система переведет его в состояние гибернации, выполните следующие действия:

  1. (Только для Android 12 и выше) Включите режим гибернации на вашем устройстве:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Установите время по умолчанию, которое система ждет, чтобы перейти в спящий режим. Таким образом, вы сможете восстановить его после тестирования:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Сократите время ожидания системы. В следующем примере система изменена таким образом, что ваше приложение переходит в спящий режим всего через одну секунду после того, как вы прекращаете взаимодействовать с приложением:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Дождитесь завершения всех загрузочных трансляций на тестовом устройстве, выполнив следующую команду:

    adb shell am wait-for-broadcast-idle
    

    Когда трансляции завершены, эта команда возвращает сообщение: All broadcast queues are idle!

  5. Вызовите процесс гибернации приложения вручную:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Только для Android 12 и выше) Убедитесь, что приложение находится в режиме гибернации, используя один из следующих методов:

    • Обратите внимание, что на тестовом устройстве теперь отображается уведомление, указывающее на то, что неиспользуемые приложения переведены в режим гибернации.
    • Выполните следующую команду:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Восстановите время ожидания по умолчанию, которое система выжидает, прежде чем перевести приложение в режим гибернации:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold
    
,

Если ваше приложение предназначено для Android 11 (API уровня 30) или выше, и пользователь не взаимодействует с вашим приложением в течение нескольких месяцев, система переводит ваше приложение в состояние гибернации . Система оптимизирует дисковое пространство вместо производительности и защищает пользовательские данные. Такое поведение системы похоже на то, что происходит, когда пользователь вручную принудительно останавливает ваше приложение из системных настроек.

Эффекты спячки

Как показано в таблице 1, эффекты спящего режима зависят от целевой версии SDK вашего приложения, а также от устройства, на котором работает ваше приложение:

Таблица 1. Влияние спящего режима на ваше приложение
Целевая версия SDK Характеристики устройства Эффекты гибернации
Android 12 или выше Работает на Android 12 или выше

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

Ваше приложение не может запускать задания или оповещения в фоновом режиме.

Ваше приложение не может получать push-уведомления, включая высокоприоритетные сообщения, отправляемые через Firebase Cloud Messaging .

Все файлы в кэше вашего приложения удаляются.

Андроид 11 Работает на Android 11 Разрешения времени выполнения вашего приложения сбрасываются.
Андроид 11 Работает на Android 6.0 (уровень API 23) по Android 10 (уровень API 29) включительно и использует сервисы Google Play.

Разрешения времени выполнения вашего приложения сбрасываются.

Такое поведение вступит в силу в декабре 2021 года. Узнайте больше в этой записи блога о том, как сделать автоматический сброс разрешений доступным для миллиардов дополнительных устройств .

Поведение системы при выходе приложения из спящего режима

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

Однако система не делает для вашего приложения следующее:

  1. Повторно предоставьте разрешения на выполнение вашего приложения.

    Пользователь должен повторно предоставить эти разрешения для вашего приложения.

  2. Перепланируйте все задания, оповещения и уведомления, которые были запланированы до перехода приложения в режим гибернации.

    Для более простой поддержки этого рабочего процесса используйте WorkManager . Вы также можете добавить логику перепланирования в широковещательном приемнике ACTION_BOOT_COMPLETED , который вызывается, когда ваше приложение выходит из спящего режима и после загрузки устройства.

Использование приложения

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

Примеры использования приложения

Когда активность в вашем приложении возобновляется, система считает это событие взаимодействием с пользователем. Поэтому система увеличивает время, по истечении которого ваше приложение перейдет в спящий режим.

На устройствах Android 11 и выше следующие действия также считаются взаимодействием с пользователем:

  • Пользователь взаимодействует с виджетом .
  • Пользователь взаимодействует с уведомлением, за исключением его отклонения.

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

  • Приложения, которые имеют поставщика услуг или контента, привязанного к другому приложению на устройстве или ОС. Например, редакторы методов ввода (IME) или менеджеры паролей.
  • Приемники вещания в пакете, получающие явную трансляцию из внешнего пакета.

Не примеры

Если ваше приложение всегда демонстрирует поведение, описанное в следующем списке, оно перейдет в спящий режим через несколько месяцев:

Системные исключения из спящего режима

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

Приложения не отображаются на панели запуска
Любое приложение, не имеющее активной плитки ярлыка на панели запуска.
Приложения рабочего профиля
Любое приложение, которое пользователь устанавливает в рабочем профиле . Обратите внимание, что если то же самое приложение также находится в личном профиле, то освобождение распространяется только на приложение рабочего профиля.
Контроллеры политики устройств
Приложения, управляющие локальными политиками устройств и системными приложениями на устройствах.
Привилегированные приложения оператора
Любое приложение, которое операторы мобильной связи предварительно загружают на устройства и считают необходимым для выполнения договорных обязательств по обслуживанию, например, приложения голосовой почты или обслуживания клиентов.
3p установщик приложений
Сторонние магазины приложений для автоматического обновления установленных приложений при необходимости.

Исключения пользователей из режима гибернации

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

  • Обеспечьте безопасность семьи, периодически сообщая о местонахождении членов семьи.
  • Синхронизируйте данные между устройством и сервером вашего приложения.
  • Общайтесь с помощью смарт-устройств, таких как телевизор.
  • Подключитесь к сопутствующим устройствам, например, часам.

Чтобы запросить освобождение, выполните действия, описанные в следующих разделах.

Проверьте, отключил ли пользователь уже режим гибернации для вашего приложения.

Чтобы проверить, отключил ли пользователь режим гибернации для вашего приложения, используйте API getUnusedAppRestrictionsStatus() .

Дополнительные сведения об использовании этого API в вашем приложении см. в примере кода API на этой странице.

Попросите пользователя отключить режим гибернации для вашего приложения.

Если пользователь еще не отключил спящий режим для вашего приложения, вы можете отправить запрос пользователю. Для этого выполните следующие действия:

  1. Отобразите пользовательский интерфейс, который объясняет пользователю, почему ему необходимо отключить режим гибернации для вашего приложения.
  2. Вызовите API createManageUnusedAppRestrictionsIntent() , как показано в примере кода API . Этот API создает намерение, которое загружает экран информации о приложении в настройках. Отсюда пользователь может отключить спящий режим для вашего приложения.

    При отправке этого намерения важно вызвать startActivityForResult() , а не startActivity() .

    Как показано в таблице 2, расположение и название параметра зависят от характеристик устройства, на котором установлено ваше приложение:

    Таблица 2. Параметр, отключающий спящий режим для вашего приложения
    Характеристики устройства Страница, где отображается опция Название опции для отключения
    Работает на Android 13 или выше Информация о приложении Приостановить работу приложения, если оно не используется
    Работает на Android 12 Информация о приложении Удалить разрешения и освободить место
    Работает на Android 11 Информация о приложении > Разрешения Удалите разрешения, если приложение не используется
    Работает на Android 6.0 - Android 10 включительно и использует сервисы Google Play. Приложение Play > Меню > Play Protect > Разрешения для неиспользуемых приложений Удалите разрешения, если приложение не используется

Пример кода API

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

Котлин

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

API устаревшей платформы

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

Если вам необходимо временно продолжить использование API в целях совместимости, следующий список показывает, как его использовать:

  • Чтобы проверить, отключен ли режим гибернации для вашего приложения: isAutoRevokeWhitelisted()
  • Чтобы отправить пользователя на страницу настроек спящего режима: создайте Intent с помощью ACTION_APPLICATION_DETAILS_SETTINGS

Вручную активируйте режим гибернации

Чтобы проверить, как ведет себя ваше приложение после того, как система переведет его в состояние гибернации, выполните следующие действия:

  1. (Только для Android 12 и выше) Включите режим гибернации на вашем устройстве:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Установите время по умолчанию, которое система ждет, чтобы перейти в спящий режим. Таким образом, вы сможете восстановить его после тестирования:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Сократите время ожидания системы. В следующем примере система изменена таким образом, что ваше приложение переходит в спящий режим всего через одну секунду после того, как вы прекращаете взаимодействовать с приложением:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Дождитесь завершения всех загрузочных трансляций на тестовом устройстве, выполнив следующую команду:

    adb shell am wait-for-broadcast-idle
    

    Когда трансляции завершены, эта команда возвращает сообщение: All broadcast queues are idle!

  5. Вызовите процесс гибернации приложения вручную:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Только для Android 12 и выше) Убедитесь, что приложение находится в режиме гибернации, используя один из следующих методов:

    • Обратите внимание, что на тестовом устройстве теперь отображается уведомление, указывающее на то, что неиспользуемые приложения переведены в режим гибернации.
    • Выполните следующую команду:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Восстановите время ожидания по умолчанию, которое система выжидает, прежде чем перевести приложение в режим гибернации:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold
    
,

Если ваше приложение предназначено для Android 11 (API уровня 30) или выше, и пользователь не взаимодействует с вашим приложением в течение нескольких месяцев, система переводит ваше приложение в состояние гибернации . Система оптимизирует дисковое пространство вместо производительности и защищает пользовательские данные. Такое поведение системы похоже на то, что происходит, когда пользователь вручную принудительно останавливает ваше приложение из системных настроек.

Эффекты спячки

Как показано в таблице 1, эффекты спящего режима зависят от целевой версии SDK вашего приложения, а также от устройства, на котором работает ваше приложение:

Таблица 1. Влияние спящего режима на ваше приложение
Целевая версия SDK Характеристики устройства Эффекты гибернации
Android 12 или выше Работает на Android 12 или выше

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

Ваше приложение не может запускать задания или оповещения в фоновом режиме.

Ваше приложение не может получать push-уведомления, включая высокоприоритетные сообщения, отправляемые через Firebase Cloud Messaging .

Все файлы в кэше вашего приложения удаляются.

Андроид 11 Работает на Android 11 Разрешения времени выполнения вашего приложения сбрасываются.
Андроид 11 Работает на Android 6.0 (уровень API 23) по Android 10 (уровень API 29) включительно и использует сервисы Google Play.

Разрешения времени выполнения вашего приложения сбрасываются.

Такое поведение вступит в силу в декабре 2021 года. Узнайте больше в этой записи блога о том, как сделать автоматический сброс разрешений доступным для миллиардов дополнительных устройств .

Поведение системы при выходе приложения из спящего режима

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

Однако система не делает для вашего приложения следующее:

  1. Повторно предоставьте разрешения на выполнение вашего приложения.

    Пользователь должен повторно предоставить эти разрешения для вашего приложения.

  2. Перепланируйте все задания, оповещения и уведомления, которые были запланированы до перехода приложения в режим гибернации.

    Для более простой поддержки этого рабочего процесса используйте WorkManager . Вы также можете добавить логику перепланирования в широковещательном приемнике ACTION_BOOT_COMPLETED , который вызывается, когда ваше приложение выходит из спящего режима и после загрузки устройства.

Использование приложения

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

Примеры использования приложения

Когда активность в вашем приложении возобновляется, система считает это событие взаимодействием с пользователем. Поэтому система увеличивает время, по истечении которого ваше приложение перейдет в спящий режим.

На устройствах Android 11 и выше следующие действия также считаются взаимодействием с пользователем:

  • Пользователь взаимодействует с виджетом .
  • Пользователь взаимодействует с уведомлением, за исключением его отклонения.

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

  • Приложения, которые имеют поставщика услуг или контента, привязанного к другому приложению на устройстве или ОС. Например, редакторы методов ввода (IME) или менеджеры паролей.
  • Приемники вещания в пакете, получающие явную трансляцию из внешнего пакета.

Не допросы

Если ваше приложение когда -либо демонстрирует поведение, описанное в следующем списке, ваше приложение входит в спячку через несколько месяцев:

Системные освобождения от спячки

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

Приложения не отображаются в пусковой установке
Любое приложение, у которого нет активной сочетания плитки на пусковой установке.
Приложения для профиля рабочего профиля
Любое приложение, которое пользователь устанавливает в рабочем профиле . Обратите внимание, что если одно и то же приложение также находится в личном профиле, только приложение для профиля работы освобождается.
Контроллеры политики устройства
Приложения, которые управляют политиками локального устройства и системными приложениями на устройствах.
Привилегированные приложения
Любое приложение, которое предварительно загружают носители мобильных телефонов на устройствах и считают необходимым для обязательств по контракту, например, приложения для голосовой почты или обслуживания клиентов.
3P приложения установщика
Сторонние приложения хранит автоматические обновления их установленных приложений при необходимости.

Пользовательские освобождения от спячки

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

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

Чтобы запросить освобождение, выполните шаги в следующих разделах.

Проверьте, отключил ли пользователь гибернацию для вашего приложения

Чтобы проверить, отключил ли пользователь гибернацию для вашего приложения, используйте API getUnusedAppRestrictionsStatus() .

Для получения дополнительной информации о том, как использовать этот API в вашем приложении, см. Пример кода API на этой странице.

Попросите пользователя отключить гибернацию для вашего приложения

Если пользователь еще не отключил гибернацию для вашего приложения, вы можете отправить запрос пользователю. Для этого выполните эти шаги:

  1. Отобразите пользовательский интерфейс, который объясняет пользователю, почему им нужно отключить спячку для вашего приложения.
  2. Вызовете API createManageUnusedAppRestrictionsIntent() , как показано в примере кода API . Этот API создает намерение, которое загружает экран информации о приложении в настройки. Отсюда пользователь может отключить спячку для вашего приложения.

    Важно, чтобы вы назвали startActivityForResult() , а не startActivity() , при отправке этого намерения.

    Как показано в таблице 2, место и имя опции зависит от характеристик устройства, на котором установлено ваше приложение:

    Таблица 2. Вариант, который отключает с зимнюю спячку для вашего приложения
    Характеристики устройства Страница, где появляется опция Имя опции выключения
    Запускает Android 13 или выше Информация о приложении Пауза приложений, если не используется
    Запускает Android 12 Информация о приложении Удалить разрешения и освободить место
    Запускает Android 11 Информация о приложении> разрешения Удалить разрешения, если приложение не используется
    Запускает Android 6.0 до Android 10, включительно, и работает от Google Play Services Play App> Menu> Play Protect> Разрешения для неиспользованных приложений Удалить разрешения, если приложение не используется

Пример кода API

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

Котлин

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

Legacy Platform API

Операционная система также включает API для взаимодействия с функцией зимней спячки. Тем не менее, API работает только на устройствах, которые запускают Android 11 или выше; API не обрабатывает функции спячки, которые возвращаются в более ранние версии Android. Поэтому мы не рекомендуем использовать API.

Если вам нужно продолжать временно использовать API для целей совместимости, в следующем списке показано, как его использовать:

  • Чтобы проверить, отключена ли сгибание для вашего приложения: isAutoRevokeWhitelisted()
  • Чтобы отправить пользователя на страницу «Настройки сгибания»: Создайте намерение с использованием ACTION_APPLICATION_DETAILS_SETTINGS

Вручную вызовать спящее поведение

Чтобы проверить, как ведет себя приложение после того, как система помещает ваше приложение в состояние спячки, выполните следующие шаги:

  1. (Только для Android 12 и выше) Включите поведение спячки на вашем устройстве:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Установите количество времени по умолчанию, которое система ждет, чтобы войти в спячку. Таким образом, вы можете восстановить его после тестирования:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Сократите количество времени, которое система ждет. В следующем примере система модифицирована таким образом, чтобы ваше приложение входило в спячку только одну секунду после того, как вы перестаете взаимодействовать с приложением:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Подождите, пока любые трансляции времени загрузки завершат ваше тестовое устройство, выполнив следующую команду:

    adb shell am wait-for-broadcast-idle
    

    Когда трансляции завершены, эта команда возвращает сообщение: All broadcast queues are idle!

  5. Вызовать процесс сгибания приложения вручную:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Только Android 12 и выше) подтверждают, что приложение спят, используя один из следующих методов:

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

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Восстановите количество времени по умолчанию, которое система ждет, прежде чем она помещает ваше приложение в спячку:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold