Android 13 的通知採用「選擇加入」模式,這與先前 Android 版本採用的「選擇退出」模式不同。在 Android 13 中,所有應用程式都必須先徵求使用者同意,才能傳送通知提示。這項模型有助於減少通知干擾、避免資訊過載,並讓使用者根據自身需求控管通知顯示內容。如要支援選擇加入模式,原始設備製造商必須在通知和執行階段權限系統中實作變更。
本頁說明原始設備製造商必須實作哪些項目才能支援這項異動,以及如何驗證實作項目。
執行選擇接收通知的變更
自 Android 13 起,應用程式必須先向系統要求 android.permission.POST_NOTIFICATION
執行階段權限,宣告傳送通知的意圖,才能傳送通知。
在 Android 13 以上版本中,決定應用程式是否可傳送通知給使用者的設定,會儲存在權限系統中。在 Android 13 之前,這項設定會儲存在通知系統中。因此,原始設備製造商必須將現有的通知資料 (應用程式是否允許傳送通知) 從通知系統遷移至執行階段權限系統。原始設備製造商也必須維護通知系統中的現有 API,向應用程式開發人員顯示這類資料。
通知和權限系統的變更,是根據使用者通知行為的選擇加入模式,並在「實作指南」一節中說明。
選擇接受型模式中的使用者通知行為
下表說明在搭載 Android 13 的裝置上,各種應用程式版本的通知行為:
搭載 Android 13 的裝置 | 指定 Android 13 以上版本的應用程式 | 指定 Android 13 以下版本的應用程式 |
---|---|---|
新安裝 | 系統會封鎖通知,直到應用程式提示為止。
應用程式會控管何時要求權限。 |
在作業系統提示前,系統會封鎖通知。
應用程式首次執行時,系統會要求授予權限。 |
現有應用程式 (升級) | 系統會允許通知,直到應用程式提示為止。
系統會授予暫時性權限,直到應用程式在首次符合條件的執行作業中要求權限為止。 |
系統會允許通知,直到作業系統提示為止。
系統會在應用程式首次執行前授予暫時權限。 |
導入指南
如需參考實作方式,請參閱通知服務、權限服務和政策服務。如要為預設權限處理常式實作例外狀況,請參閱「執行階段權限」。
導入時,請遵守下列使用者通知行為規範,適用於指定 Android 13 以下 SDK 的應用程式:
- 在 Android 13 裝置上,新安裝的應用程式必須先獲得使用者核准權限提示,才能傳送通知。
- 如果應用程式指定 Android 13 以上版本,就必須等到應用程式提示,才能傳送通知,因為應用程式會控管要求使用者授予權限的時機和方式。
- 如果應用程式指定低於 Android 13 的版本,則必須封鎖通知,直到作業系統提示為止。作業系統必須在應用程式首次執行時顯示權限提示。
升級至 Android 13 前已安裝在裝置上的應用程式,或是透過備份與還原作業還原的應用程式,都必須獲准傳送通知,直到使用者首次從該應用程式啟動活動為止。
如果應用程式指定 Android 13 以上版本的 SDK,且使用者先前未在應用程式或
NotificationChannel
層級自訂這類應用程式的通知設定,請撤銷臨時授予的權限。應用程式必須先徵求使用者同意,才能繼續傳送通知。如果升級後的應用程式指定 Android 13 為目標平台,且目前未透過暫時升級授權取得通知權限,而使用者至少啟動過一次應用程式,則應用程式必須先顯示通知權限提示,才能執行任何後續前景服務。
如果應用程式的目標 SDK 版本低於 Android 13,請在應用程式建立至少一個
NotificationChannel
後攔截首次啟動的活動,顯示權限提示,詢問使用者是否要接收應用程式的通知。如果使用者先前在升級裝置上或還原至裝置的備份中,自訂了應用程式或
NotificationChannel
層級的通知設定,則必須使用FLAG_PERMISSION_USER_SET
標記,將應用程式層級設定遷移至權限系統。除非應用程式明確要求,否則不得向使用者顯示進一步的通知權限提示。
Android 13 裝置與搭載舊版 OS 的裝置之間,必須能互相備份及還原資料。Android 13 裝置產生的備份資料必須還原到較舊的作業系統版本,而較舊作業系統版本的備份資料則必須還原到 Android 13 裝置。
與持續播放媒體相關聯的媒體通知必須免除通知權限。
驗證通知和權限系統的變更
如要驗證導入作業,請執行下列測試:
如
PreferencesHelperTest
和NotificationManagerServiceTest
中所指定。任何測試升級、備份及還原功能的手動測試。
任何會傳送通知的 CTS 權限和通知系統測試。 部分測試位於 cts/tests/tests/permission/、NotificationManagerTest.java 和 cts/tests/tests/notificationlegacy/。