Android 16 平台包含可能對應用程式造成影響的行為變更。無論 targetSdkVersion
為何,當應用程式在 Android 16 上執行時,下列行為變更將會套用至所有應用程式。您應測試應用程式,並視需要修改,以便在適當情況下支援這些變更。
另請務必查看僅對指定 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 裝置上執行,您就可以啟用特定工作配額最佳化設定的覆寫功能。
如要停用「top state will adhere to job runtime quota」的強制執行功能,請執行下列 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 16 包含下列變更,旨在打造更一致、直覺的使用者體驗。
淘汰干擾性無障礙工具的公告
Android 16 已淘汰無障礙公告,這類公告的特色是使用 announceForAccessibility
或調度 TYPE_ANNOUNCEMENT
無障礙事件。這可能會為 TalkBack 和 Android 螢幕閱讀器的使用者帶來不一致的使用者體驗,而替代方案可在各種 Android 輔助技術中,滿足更廣泛的使用者需求。
替代方案範例:
- 如要進行重大的 UI 變更 (例如變更視窗),請使用
Activity.setTitle(CharSequence)
和setAccessibilityPaneTitle(java.lang.CharSequence)
。在 Compose 中使用Modifier.semantics { paneTitle = "paneTitle" }
- 如要通知使用者關鍵 UI 的變更,請使用
setAccessibilityLiveRegion(int)
。在 Compose 中使用Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
。這些事件應謹慎使用,因為每次 View 更新時,這些事件都可能產生通知。 - 如要通知使用者錯誤,請傳送
AccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
類型的AccessibilityEvent
,並設定AccessibilityNodeInfo#setError(CharSequence)
,或使用TextView#setError(CharSequence)
。
如要進一步瞭解建議的替代方案,請參閱已淘汰的 announceForAccessibility
API 參考說明文件。