![](https://developer.android.google.cn/static/images/about/versions/13/predictive-back-nav-home.gif?authuser=0000&hl=ru)
В Android 14 (уровень API 34) добавлена поддержка дополнительных системных анимаций и API для создания пользовательских анимаций. Дополнительные сведения см. в разделе Добавление поддержки встроенных и настраиваемых прогнозируемых задних анимаций .
Например, с помощью жеста назад можно отобразить анимированный предварительный просмотр главного экрана позади вашего приложения, как показано на макете на рис. 1. Начиная с Android 13, вы можете протестировать эту анимацию возвращения домой , включив опцию разработчика ( как описано на этой странице).
Для поддержки предиктивного жеста назад необходимо обновить приложение с помощью обратно совместимого API OnBackPressedCallback
AppCompat 1.6.0-alpha05 (AndroidX) или более поздней версии или с помощью нового API платформы OnBackInvokedCallback
. Большинство приложений будут использовать обратно совместимый API AndroidX.
Это обновление предоставляет путь миграции для правильного перехвата обратной навигации, который включает замену обратных перехватов из KeyEvent.KEYCODE_BACK
и любых классов с методами onBackPressed
, таких как Activity
и Dialog
на новые системные API Back.
Видео Codelab и Google I/O
Помимо использования документации на этой странице, попробуйте нашу кодовую лабораторию . Он обеспечивает общую реализацию сценария использования WebView, обрабатывающую прогнозирующий жест назад с использованием API-интерфейсов активности AndroidX.
Вы также можете просмотреть наше видео Google I/O, в котором рассматриваются дополнительные примеры реализации AndroidX и API-интерфейсов платформы.
Обновите приложение, которое использует обратную навигацию по умолчанию.
Обновить приложение для поддержки этой функции несложно, если ваше приложение не реализует какое-либо настраиваемое обратное поведение (другими словами, оно оставляет обработку обратной связи на усмотрение системы). Включите эту функцию , как описано в этом руководстве.
Если ваше приложение использует фрагменты или компонент навигации, также обновите его до AndroidX Activity 1.6.0-alpha05 или выше.
Обновите приложение, использующее пользовательскую обратную навигацию.
Если ваше приложение реализует настраиваемое поведение возврата, существуют разные пути миграции в зависимости от того, использует ли оно AndroidX и как оно обрабатывает обратную навигацию.
Ваше приложение использует AndroidX | Как ваше приложение обрабатывает обратную навигацию | Рекомендуемый путь миграции (ссылка на этой странице) |
Да | API-интерфейсы AndroidX | Перенести существующую реализацию AndroidX обратно. |
Неподдерживаемые API платформы | Перенесите приложение AndroidX, содержащее неподдерживаемые API обратной навигации, на API AndroidX. | |
Нет | Неподдерживаемые API платформы, возможность миграции. | Перенесите приложение, использующее неподдерживаемые API обратной навигации, на API платформы. |
Неподдерживаемые API платформы, но невозможно перенести | Отложите подписку до тех пор, пока это не станет обязательной функцией. |
Перенос реализации обратной навигации AndroidX
Этот вариант использования является наиболее распространенным (и наиболее рекомендуемым). Это применимо к новым или существующим приложениям, которые реализуют пользовательскую обработку навигации с помощью жестов с помощью OnBackPressedDispatcher
, как описано в разделе Предоставление пользовательской обратной навигации .
Если ваше приложение попадает в эту категорию, выполните следующие действия, чтобы добавить поддержку интеллектуального жеста назад:
Чтобы гарантировать, что API, которые уже используют API
OnBackPressedDispatcher
(например, фрагменты и компонент навигации), беспрепятственно работают с прогнозирующим жестом назад, обновите AndroidX Activity 1.6.0-alpha05 .// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
Включите интеллектуальный жест назад , как описано на этой странице.
Перенесите приложение AndroidX, содержащее неподдерживаемые API обратной навигации, на API AndroidX.
Если ваше приложение использует библиотеки AndroidX, но реализует или ссылается на неподдерживаемые API обратной навигации, вам необходимо перейти на использование API AndroidX для поддержки нового поведения.
Чтобы перенести неподдерживаемые API на API AndroidX:
Перенесите логику обработки возврата вашей системы в
OnBackPressedDispatcher
AndroidX с помощью реализацииOnBackPressedCallback
. Подробные инструкции см. в разделе Предоставление пользовательской обратной навигации .Отключите
OnBackPressedCallback
когда будете готовы прекратить перехват жеста назад.Прекратите перехват обратных событий через
OnBackPressed
илиKeyEvent.KEYCODE_BACK
.Обязательно обновите AndroidX Activity 1.6.0-alpha05 .
// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
После успешного переноса приложения включите интеллектуальный жест назад (как описано на этой странице), чтобы увидеть системную анимацию возврата на дом.
Перенесите приложение, использующее неподдерживаемые API обратной навигации, на API платформы.
Если ваше приложение не может использовать библиотеки AndroidX и вместо этого реализует или ссылается на пользовательскую навигацию «Назад» с использованием неподдерживаемых API, вам необходимо перейти на API платформы OnBackInvokedCallback
.
Выполните следующие шаги, чтобы перенести неподдерживаемые API на API платформы:
Используйте новый API
OnBackInvokedCallback
на устройствах под управлением Android 13 или более поздней версии и используйте неподдерживаемые API на устройствах под управлением Android 12 или более ранней версии.Зарегистрируйте свою пользовательскую обратную логику в
OnBackInvokedCallback
с помощьюonBackInvokedDispatcher
. Это предотвращает завершение текущего действия, и ваш обратный вызов получает возможность отреагировать на действие «Назад», как только пользователь завершит системную навигацию «Назад».Отмените регистрацию
OnBackInvokedCallback
когда будете готовы прекратить перехват жеста назад. В противном случае пользователи могут столкнуться с нежелательным поведением при использовании системы «Назад» — например, «зависанием» между представлениями и принуждением их принудительно закрыть приложение.Вот пример того, как перенести логику из
onBackPressed
:Котлин
@Override fun onCreate() { if (BuildCompat.isAtLeastT()) { onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { /** * onBackPressed logic goes here. For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/window/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } } }
Ява
@Override void onCreate() { if (BuildCompat.isAtLeastT()) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, () -> { /** * onBackPressed logic goes here - For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } ); } }
Прекратите перехват обратных событий через
OnBackPressed
илиKeyEvent.KEYCODE_BACK
для Android 13 и более поздних версий.После успешного переноса приложения включите предиктивный жест возврата (как описано на этой странице), чтобы
OnBackInvokedCallback
вступил в силу.
Вы можете зарегистрировать OnBackInvokedCallback
с помощью PRIORITY_DEFAULT
или PRIORITY_OVERLAY
, который недоступен в аналогичном AndroidX OnBackPressedCallback
. Регистрация обратного вызова с помощью PRIORITY_OVERLAY
может оказаться полезной в некоторых случаях. Это может применяться в случае перехода с onKeyPreIme()
и ваш обратный вызов должен получить жест возврата вместо открытого IME. IME регистрируют обратные вызовы с PRIORITY_DEFAULT
при открытии. Зарегистрируйте обратный вызов с помощью PRIORITY_OVERLAY
, чтобы OnBackInvokedDispatcher
отправлял жест возврата в обратный вызов вместо открытого IME.
Включите интеллектуальный жест назад
Определив, как обновить приложение в зависимости от вашего случая, включите поддержку интеллектуального жеста назад.
Чтобы принять участие, в AndroidManifest.xml
в теге <application>
установите для флага android:enableOnBackInvokedCallback
значение true
.
<application
...
android:enableOnBackInvokedCallback="true"
... >
...
</application>
Если вы не укажете значение, по умолчанию оно будет иметь значение false
и выполняет следующие действия:
- Отключает анимацию системы прогнозируемых жестов назад.
- Игнорирует
OnBackInvokedCallback
, но вызовыOnBackPressedCallback
продолжают работать.
Согласие на уровне активности
Начиная с Android 14, флаг android:enableOnBackInvokedCallback
позволяет вам включить прогнозируемую системную анимацию на уровне активности. Такое поведение делает более управляемым переход больших приложений с несколькими действиями на интеллектуальные жесты назад.
В следующем коде показан пример использования enableOnBackInvokedCallback
для включения системной анимации возврата домой из MainActivity
:
<manifest ...>
<application . . .
android:enableOnBackInvokedCallback="false">
<activity
android:name=".MainActivity"
android:enableOnBackInvokedCallback="true"
...
</activity>
<activity
android:name=".SecondActivity"
android:enableOnBackInvokedCallback="false"
...
</activity>
</application>
</manifest>
В предыдущем примере установка android:enableOnBackInvokedCallback=true
для ".SecondActivity"
включает системную анимацию перекрестных действий.
При использовании флага android:enableOnBackInvokedCallback
учитывайте следующие соображения:
- Установка
android:enableOnBackInvokedCallback=false
отключает прогнозирующую обратную анимацию либо на уровне активности, либо на уровне приложения, в зависимости от того, где вы установили тег, и предписывает системе игнорировать вызовы API платформыOnBackInvokedCallback
. Однако вызовыOnBackPressedCallback
продолжают выполняться, посколькуOnBackPressedCallback
обратно совместим и вызывает APIonBackPressed
, который не поддерживался до Android 13. - Установка флага
enableOnBackInvokedCallback
на уровне приложения устанавливает значение по умолчанию для всех действий в приложении. Вы можете переопределить значение по умолчанию для каждого действия, установив флаг на уровне действия, как показано в предыдущем примере кода.
Рекомендации по обратному вызову
Ниже приведены рекомендации по использованию поддерживаемых системных обратных вызовов; BackHandler
(для Compose), OnBackPressedCallback
или OnBackInvokedCallback
.
Определите состояние пользовательского интерфейса, которое включает и отключает каждый обратный вызов.
Состояние пользовательского интерфейса — это свойство, описывающее пользовательский интерфейс. Мы рекомендуем выполнить следующие шаги высокого уровня.
Определите состояние пользовательского интерфейса, которое включает и отключает каждый обратный вызов.
Определите это состояние, используя наблюдаемый тип держателя данных , например
StateFlow
или Compose State, и включите или отключите обратный вызов при изменении состояния.
Если ваше приложение ранее связывало обратную логику с условными операторами, это может означать, что вы реагируете на обратное событие уже после того, как оно уже произошло — этого следует избегать при использовании новых обратных вызовов. Если возможно, переместите обратный вызов за пределы условного оператора и вместо этого свяжите обратный вызов с наблюдаемым типом держателя данных.
Используйте обратные вызовы системы для логики пользовательского интерфейса.
Логика пользовательского интерфейса определяет, как отображать пользовательский интерфейс. Используйте обратные вызовы системы для запуска логики пользовательского интерфейса, например отображения всплывающего окна или запуска анимации.
Если ваше приложение включает обратный системный обратный вызов, прогнозирующая анимация не запускается, и вам придется обрабатывать обратное событие. Не создавайте обратные вызовы только для запуска логики, не связанной с пользовательским интерфейсом.
Например, если вы перехватываете обратные события только для регистрации, вместо этого войдите в жизненный цикл действия или фрагмента.
- Для случаев «действия-действия» или «фрагмент-действия» регистрируйте, имеет ли
isFinishing
вonDestroy
значениеtrue
в течение жизненного цикла действия. - Для случаев перехода от фрагмента к фрагменту регистрируйте, если
isRemoving
внутриonDestroy
имеет значение true в течение жизненного цикла представления фрагмента; или войдите в систему с помощью методовonBackStackChangeStarted
илиonBackStackChangeCommitted
вFragmentManager.OnBackStackChangedListener
.
В случае Compose войдите в обратный вызов onCleared()
ViewModel
, связанной с местом назначения Compose. Это лучший сигнал, позволяющий узнать, когда пункт назначения был извлечен из стека и уничтожен.
Создание обратных вызовов с единой ответственностью
Это возможно, потому что вы можете добавить в диспетчер несколько обратных вызовов. Обратные вызовы добавляются в стек, в котором последний добавленный включенный обратный вызов обрабатывает следующий жест обратного вызова с одним обратным вызовом на каждый жест обратного вызова.
Проверьте анимацию прогнозируемого жеста назад.
Начиная с финальной версии Android 13, у вас появится возможность включить опцию разработчика для тестирования анимации возвращения домой, показанной на рис. 1.
Чтобы протестировать эту анимацию, выполните следующие шаги:
На своем устройстве выберите «Настройки» > «Система» > «Параметры разработчика» .
Выберите «Прогнозирующая анимация спины» .
Запустите обновленное приложение и используйте жест назад, чтобы увидеть его в действии.
![](https://developer.android.google.cn/static/images/about/versions/13/predictive-back-nav-home.gif?authuser=0000&hl=ru)
В Android 14 (уровень API 34) добавлена поддержка дополнительных системных анимаций и API для создания пользовательских анимаций. Дополнительные сведения см. в разделе Добавление поддержки встроенных и настраиваемых прогнозируемых задних анимаций .
Например, с помощью жеста назад можно отобразить анимированный предварительный просмотр главного экрана позади вашего приложения, как показано на макете на рис. 1. Начиная с Android 13, вы можете протестировать эту анимацию возвращения домой , включив опцию разработчика ( как описано на этой странице).
Для поддержки предиктивного жеста назад необходимо обновить приложение с помощью обратно совместимого API OnBackPressedCallback
AppCompat 1.6.0-alpha05 (AndroidX) или более поздней версии или с помощью нового API платформы OnBackInvokedCallback
. Большинство приложений будут использовать обратно совместимый API AndroidX.
Это обновление предоставляет путь миграции для правильного перехвата обратной навигации, который включает замену обратных перехватов из KeyEvent.KEYCODE_BACK
и любых классов с методами onBackPressed
, таких как Activity
и Dialog
на новые системные API Back.
Видео Codelab и Google I/O
Помимо использования документации на этой странице, попробуйте нашу кодовую лабораторию . Он обеспечивает общую реализацию сценария использования WebView, обрабатывающую прогнозирующий жест назад с использованием API-интерфейсов активности AndroidX.
Вы также можете просмотреть наше видео Google I/O, в котором рассматриваются дополнительные примеры реализации AndroidX и API-интерфейсов платформы.
Обновите приложение, которое использует обратную навигацию по умолчанию.
Обновить приложение для поддержки этой функции несложно, если ваше приложение не реализует какое-либо настраиваемое обратное поведение (другими словами, оно оставляет обработку обратной связи на усмотрение системы). Включите эту функцию , как описано в этом руководстве.
Если ваше приложение использует фрагменты или компонент навигации, также обновите его до AndroidX Activity 1.6.0-alpha05 или выше.
Обновите приложение, использующее пользовательскую обратную навигацию.
Если ваше приложение реализует настраиваемое поведение возврата, существуют разные пути миграции в зависимости от того, использует ли оно AndroidX и как оно обрабатывает обратную навигацию.
Ваше приложение использует AndroidX | Как ваше приложение обрабатывает обратную навигацию | Рекомендуемый путь миграции (ссылка на этой странице) |
Да | API-интерфейсы AndroidX | Перенести существующую реализацию AndroidX обратно. |
Неподдерживаемые API платформы | Перенесите приложение AndroidX, содержащее неподдерживаемые API обратной навигации, на API AndroidX. | |
Нет | Неподдерживаемые API-интерфейсы платформы, возможность миграции. | Перенесите приложение, использующее неподдерживаемые API обратной навигации, на API платформы. |
Неподдерживаемые API платформы, но невозможно перенести | Отложите подписку до тех пор, пока это не станет обязательной функцией. |
Перенос реализации обратной навигации AndroidX
Этот вариант использования является наиболее распространенным (и наиболее рекомендуемым). Это применимо к новым или существующим приложениям, которые реализуют пользовательскую обработку навигации с помощью жестов с помощью OnBackPressedDispatcher
, как описано в разделе Предоставление пользовательской обратной навигации .
Если ваше приложение попадает в эту категорию, выполните следующие действия, чтобы добавить поддержку интеллектуального жеста назад:
Чтобы гарантировать, что API, которые уже используют API
OnBackPressedDispatcher
(например, фрагменты и компонент навигации), беспрепятственно работают с прогнозирующим жестом назад, обновите AndroidX Activity 1.6.0-alpha05 .// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
Включите интеллектуальный жест назад , как описано на этой странице.
Перенесите приложение AndroidX, содержащее неподдерживаемые API обратной навигации, на API AndroidX.
Если ваше приложение использует библиотеки AndroidX, но реализует или ссылается на неподдерживаемые API обратной навигации, вам необходимо перейти на использование API AndroidX для поддержки нового поведения.
Чтобы перенести неподдерживаемые API на API AndroidX:
Перенесите логику обработки возврата вашей системы в
OnBackPressedDispatcher
AndroidX с помощью реализацииOnBackPressedCallback
. Подробные инструкции см. в разделе Предоставление пользовательской обратной навигации .Отключите
OnBackPressedCallback
когда будете готовы прекратить перехват жеста назад.Прекратите перехват обратных событий через
OnBackPressed
илиKeyEvent.KEYCODE_BACK
.Обязательно обновите AndroidX Activity 1.6.0-alpha05 .
// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
После успешного переноса приложения включите интеллектуальный жест возврата (как описано на этой странице), чтобы увидеть системную анимацию возврата на дом.
Перенесите приложение, использующее неподдерживаемые API обратной навигации, на API платформы.
Если ваше приложение не может использовать библиотеки AndroidX и вместо этого реализует или ссылается на пользовательскую навигацию «Назад» с использованием неподдерживаемых API, вам необходимо перейти на API платформы OnBackInvokedCallback
.
Выполните следующие шаги, чтобы перенести неподдерживаемые API на API платформы:
Используйте новый API
OnBackInvokedCallback
на устройствах под управлением Android 13 или более поздней версии и используйте неподдерживаемые API на устройствах под управлением Android 12 или более ранней версии.Зарегистрируйте свою пользовательскую обратную логику в
OnBackInvokedCallback
с помощьюonBackInvokedDispatcher
. Это предотвращает завершение текущего действия, и ваш обратный вызов получает возможность отреагировать на действие «Назад», как только пользователь завершит системную навигацию «Назад».Отмените регистрацию
OnBackInvokedCallback
когда будете готовы прекратить перехват жеста назад. В противном случае пользователи могут столкнуться с нежелательным поведением при использовании системной навигации «Назад» — например, «застреванием» между представлениями и принуждением их принудительно закрыть приложение.Вот пример того, как перенести логику из
onBackPressed
:Котлин
@Override fun onCreate() { if (BuildCompat.isAtLeastT()) { onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { /** * onBackPressed logic goes here. For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/window/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } } }
Ява
@Override void onCreate() { if (BuildCompat.isAtLeastT()) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, () -> { /** * onBackPressed logic goes here - For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } ); } }
Прекратите перехват обратных событий через
OnBackPressed
илиKeyEvent.KEYCODE_BACK
для Android 13 и более поздних версий.После успешного переноса приложения включите предиктивный жест возврата (как описано на этой странице), чтобы
OnBackInvokedCallback
вступил в силу.
Вы можете зарегистрировать OnBackInvokedCallback
с помощью PRIORITY_DEFAULT
или PRIORITY_OVERLAY
, который недоступен в аналогичном AndroidX OnBackPressedCallback
. Регистрация обратного вызова с помощью PRIORITY_OVERLAY
может оказаться полезной в некоторых случаях. Это может применяться в случае перехода с onKeyPreIme()
и ваш обратный вызов должен получить жест возврата вместо открытого IME. IME регистрируют обратные вызовы с PRIORITY_DEFAULT
при открытии. Зарегистрируйте обратный вызов с помощью PRIORITY_OVERLAY
, чтобы OnBackInvokedDispatcher
отправлял жест возврата в обратный вызов вместо открытого IME.
Включите интеллектуальный жест назад
Определив, как обновить приложение в зависимости от вашего случая, включите поддержку интеллектуального жеста назад.
Чтобы принять участие, в AndroidManifest.xml
в теге <application>
установите для флага android:enableOnBackInvokedCallback
значение true
.
<application
...
android:enableOnBackInvokedCallback="true"
... >
...
</application>
Если вы не укажете значение, оно по умолчанию будет равно false
и выполняет следующие действия:
- Отключает анимацию системы прогнозируемых жестов назад.
- Игнорирует
OnBackInvokedCallback
, но вызовыOnBackPressedCallback
продолжают работать.
Согласие на уровне активности
Начиная с Android 14, флаг android:enableOnBackInvokedCallback
позволяет вам включить прогнозируемую системную анимацию на уровне активности. Такое поведение делает более управляемым переход больших приложений с несколькими действиями на интеллектуальные жесты назад.
В следующем коде показан пример использования enableOnBackInvokedCallback
для включения системной анимации возврата домой из MainActivity
:
<manifest ...>
<application . . .
android:enableOnBackInvokedCallback="false">
<activity
android:name=".MainActivity"
android:enableOnBackInvokedCallback="true"
...
</activity>
<activity
android:name=".SecondActivity"
android:enableOnBackInvokedCallback="false"
...
</activity>
</application>
</manifest>
В предыдущем примере установка android:enableOnBackInvokedCallback=true
для ".SecondActivity"
включает системную анимацию перекрестных действий.
При использовании флага android:enableOnBackInvokedCallback
учитывайте следующие соображения:
- Установка
android:enableOnBackInvokedCallback=false
отключает прогнозирующую обратную анимацию либо на уровне активности, либо на уровне приложения, в зависимости от того, где вы установили тег, и предписывает системе игнорировать вызовы API платформыOnBackInvokedCallback
. Однако вызовыOnBackPressedCallback
продолжают выполняться, посколькуOnBackPressedCallback
обратно совместим и вызывает APIonBackPressed
, который не поддерживался до Android 13. - Установка флага
enableOnBackInvokedCallback
на уровне приложения устанавливает значение по умолчанию для всех действий в приложении. Вы можете переопределить значение по умолчанию для каждого действия, установив флаг на уровне действия, как показано в предыдущем примере кода.
Рекомендации по обратному вызову
Ниже приведены рекомендации по использованию поддерживаемых системных обратных вызовов; BackHandler
(для Compose), OnBackPressedCallback
или OnBackInvokedCallback
.
Определите состояние пользовательского интерфейса, которое включает и отключает каждый обратный вызов.
Состояние пользовательского интерфейса — это свойство, описывающее пользовательский интерфейс. Мы рекомендуем выполнить следующие шаги высокого уровня.
Определите состояние пользовательского интерфейса, которое включает и отключает каждый обратный вызов.
Определите это состояние, используя наблюдаемый тип держателя данных , например
StateFlow
или Compose State, и включите или отключите обратный вызов при изменении состояния.
Если ваше приложение ранее связывало обратную логику с условными операторами, это может означать, что вы реагируете на обратное событие уже после того, как оно уже произошло — этого следует избегать при использовании новых обратных вызовов. Если возможно, переместите обратный вызов за пределы условного оператора и вместо этого свяжите обратный вызов с наблюдаемым типом держателя данных.
Используйте обратные вызовы системы для логики пользовательского интерфейса.
Логика пользовательского интерфейса определяет, как отображать пользовательский интерфейс. Используйте обратные вызовы системы для запуска логики пользовательского интерфейса, например отображения всплывающего окна или запуска анимации.
Если ваше приложение включает обратный системный обратный вызов, прогнозирующая анимация не запускается, и вам придется обрабатывать обратное событие. Не создавайте обратные вызовы только для запуска логики, не связанной с пользовательским интерфейсом.
Например, если вы перехватываете обратные события только для регистрации, вместо этого войдите в жизненный цикл действия или фрагмента.
- Для случаев «действия-действия» или «фрагмент-действия» регистрируйте, имеет ли
isFinishing
вonDestroy
значениеtrue
в течение жизненного цикла действия. - Для случаев перехода от фрагмента к фрагменту регистрируйте, если
isRemoving
внутриonDestroy
имеет значение true в течение жизненного цикла представления фрагмента; или войдите в систему, используя методыonBackStackChangeStarted
илиonBackStackChangeCommitted
вFragmentManager.OnBackStackChangedListener
.
В случае Compose войдите в обратный вызов onCleared()
ViewModel
, связанной с местом назначения Compose. Это лучший сигнал, позволяющий узнать, когда пункт назначения был извлечен из стека и уничтожен.
Создание обратных вызовов с единой ответственностью
Это возможно, потому что вы можете добавить в диспетчер несколько обратных вызовов. Обратные вызовы добавляются в стек, в котором последний добавленный включенный обратный вызов обрабатывает следующий жест обратного вызова с одним обратным вызовом на каждый жест обратного вызова.
Проверьте анимацию прогнозируемого жеста назад.
Начиная с финальной версии Android 13, у вас появится возможность включить опцию разработчика для тестирования анимации возвращения домой, показанной на рис. 1.
Чтобы протестировать эту анимацию, выполните следующие шаги:
На своем устройстве выберите «Настройки» > «Система» > «Параметры разработчика» .
Выберите «Прогнозирующая анимация спины» .
Запустите обновленное приложение и используйте жест назад, чтобы увидеть его в действии.