Android 13 的通知採用「選擇加入」模式,這與先前 Android 版本使用的「選擇不接收」模式不同。在 Android 13 中,所有應用程式都必須先徵求使用者同意,才能傳送通知提示。這項模型有助於減少通知干擾、避免資訊過載,並讓使用者根據自身需求控管通知顯示內容。如要支援選擇加入模式,原始設備製造商必須在通知和執行階段權限系統中實作變更。
本頁說明 OEM 必須實作哪些項目才能支援這項異動,以及如何驗證實作項目。
執行選擇接收通知的變更
自 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/。