Платформа Android 16 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения поведения применяются ко всем приложениям , работающим на Android 16, независимо от targetSdkVersion
. Вам следует протестировать свое приложение, а затем при необходимости изменить его для поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь также со списком изменений поведения, которые влияют только на приложения, ориентированные на Android 16 .
Основная функциональность
Android 16 включает следующие изменения, которые изменяют или расширяют различные основные возможности системы Android.
Оптимизация квот JobScheduler
从 Android 16 开始,我们将根据以下因素调整常规作业和加急作业执行运行时配额:
- 应用位于哪个应用待机分桶:在 Android 16 中,系统将开始使用充足的运行时配额来强制执行处于活动状态的待机分桶。
- 如果作业在应用处于顶部状态时开始执行:在 Android 16 中,如果作业在应用对用户可见时启动,并在应用变为不可见后继续执行,则将遵循作业运行时配额。
- 如果作业在运行前台服务时执行:在 Android 16 中,与前台服务同时执行的作业将遵循作业运行时配额。如果您要使用作业进行用户发起的数据传输,请考虑改用用户发起的数据传输作业。
此更改会影响使用 WorkManager、JobScheduler 和 DownloadManager 调度的任务。如需调试作业停止的原因,我们建议您通过调用 WorkInfo.getStopReason()
来记录作业停止的原因(对于 JobScheduler 作业,请调用 JobParameters.getStopReason()
)。
如需详细了解有关延长电池续航时间的最佳实践,请参阅有关优化任务调度 API 的电池用量的指南。
我们还建议您利用 Android 16 中引入的新 JobScheduler#getPendingJobReasonsHistory
API 来了解作业未执行的原因。
测试
如需测试应用的行为,您可以启用替换特定作业配额优化,前提是应用在 Android 16 设备上运行。
如需停用强制执行“顶部状态将遵守作业运行时配额”政策,请运行以下 adb
命令:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
如需停用强制执行“与前台服务同时执行的作业将遵守作业运行时配额”政策,请运行以下 adb
命令:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
如需测试特定的应用待机分桶行为,您可以使用以下 adb
命令设置应用的应用待机分桶:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
如需了解应用所在的应用待机分桶,您可以使用以下 adb
命令获取应用的应用待机分桶:
adb shell am get-standby-bucket APP_PACKAGE_NAME
Полное прекращение поддержки JobInfo#setImportantWhileForeground
Метод JobInfo.Builder#setImportantWhileForeground(boolean)
указывает на важность задания, когда приложение планирования находится на переднем плане или когда временно освобождено от фоновых ограничений.
Этот метод устарел с Android 12 (уровень API 31). Начиная с Android 16, он больше не работает эффективно, и вызов этого метода будет игнорироваться.
Это удаление функциональности также применимо к JobInfo#isImportantWhileForeground()
. Начиная с Android 16, при вызове метода метод возвращает false
.
Упорядоченная область приоритета широковещательной передачи больше не является глобальной.
Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority
属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority()
API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。
在 Android 16 中,无法保证使用 android:priority
属性或 IntentFilter#setPriority()
在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。
此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY
+ 1, SYSTEM_HIGH_PRIORITY
- 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITY
、SYSTEM_HIGH_PRIORITY
设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
Внутренние изменения АРТ
Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。
发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。
依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。
所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。
Пользовательский опыт и системный интерфейс
Android 16 включает следующие изменения, призванные создать более последовательный и интуитивно понятный пользовательский интерфейс.
Отказ от деструктивных объявлений о доступности
В Android 16 больше не поддерживаются объявления о специальных возможностях, характеризующиеся использованием announceForAccessibility
или отправкой событий доступности TYPE_ANNOUNCEMENT
. Это может создать несогласованный пользовательский опыт для пользователей TalkBack и программы чтения с экрана Android, а альтернативы лучше удовлетворяют более широкий спектр потребностей пользователей в различных вспомогательных технологиях Android.
Примеры альтернатив:
- Для значительных изменений пользовательского интерфейса, таких как изменения окон, используйте
Activity.setTitle(CharSequence)
иsetAccessibilityPaneTitle(java.lang.CharSequence)
. В Compose используйтеModifier.semantics { paneTitle = "paneTitle" }
- Чтобы сообщить пользователю об изменениях в критическом пользовательском интерфейсе, используйте
setAccessibilityLiveRegion(int)
. В Compose используйтеModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
. Их следует использовать с осторожностью, поскольку они могут генерировать объявления каждый раз при обновлении представления. - Чтобы уведомить пользователей об ошибках, отправьте
AccessibilityEvent
типаAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
и установитеAccessibilityNodeInfo#setError(CharSequence)
или используйтеTextView#setError(CharSequence)
.
Справочная документация по устаревшему API announceForAccessibility
содержит более подробную информацию о предлагаемых альтернативах.
Поддержка трехкнопочной навигации.
В Android 16 добавлена поддержка прогнозного возврата в трехкнопочную навигацию для приложений, которые правильно перешли на интеллектуальный возврат . Длительное нажатие кнопки «Назад» запускает прогнозирующую анимацию возврата, давая вам предварительный просмотр того, куда вас приведет смахивание назад.
Такое поведение применимо ко всем областям системы, которые поддерживают прогнозирующую анимацию возврата, включая системную анимацию (возврат домой, перекрестные задачи и перекрестные действия).