建立及管理通知管道

從 Android 8.0 (API 級別 26) 開始,所有通知都必須指派專屬管道。您可以為每個管道設定視覺和聽覺行為,並套用至該管道中的所有通知。使用者可以變更這些設定,並決定應用程式的哪些通知管道可以干擾或顯示。

請觀看下方影片,概略瞭解 Android 8.0 的管道和其他通知功能。

在系統設定中,每個應用程式都有通知管道的使用者設定,如圖 1 所示。

圖 1. 「時鐘」應用程式的通知設定,以及該應用程式的某個管道。

建立通知管道後,就無法變更通知行為。使用者擁有完整控制權。但仍可變更頻道名稱和說明。

請為每種需要傳送的通知建立管道。您也可以建立通知管道,反映使用者所做的選擇。舉例來說,針對訊息應用程式中建立的每個對話群組,您可以分別設定通知管道。

如果指定 Android 8.0 (API 級別 26) 以上版本,則必須實作一或多個通知管道。如果 targetSdkVersion 設為 25 以下,當應用程式在 Android 8.0 (API 級別 26) 以上版本執行時,行為會與在搭載 Android 7.1 (API 級別 25) 以下版本的裝置上相同。

建立通知管道

如要建立通知管道,請按照下列步驟操作:

  1. 使用專屬頻道 ID、使用者可見名稱和重要性等級,建構 NotificationChannel 物件。

  2. 您也可以使用 setDescription() 指定使用者在系統設定中看到的說明。

  3. 將通知管道傳遞至 createNotificationChannel(),藉此註冊通知管道。

以下範例說明如何建立及註冊通知管道:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel.
    val importance = NotificationManager.IMPORTANCE_DEFAULT
    val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel.description = descriptionText
    // Register the channel with the system. You can't change the importance
    // or other notification behaviors after this.
    val notificationManager =
        context.getSystemService(NotificationManager::class.java)
    notificationManager?.createNotificationChannel(mChannel)
}

使用原始值重新建立現有通知管道不會執行任何作業,因此在啟動應用程式時呼叫此程式碼是安全的。

根據預設,發布至特定管道的所有通知都會使用 NotificationManagerCompat 類別中重要性層級定義的視覺和聽覺行為,例如 IMPORTANCE_DEFAULT 或 IMPORTANCE_HIGH。如要進一步瞭解重要性等級,請參閱下一節。

如要進一步自訂頻道的預設通知行為,您可以在 NotificationChannel 上呼叫 enableLights()、setLightColor() 和 setVibrationPattern() 等方法。請注意,建立管道後,您就無法變更這些設定,且使用者對這些行為是否啟用擁有最終控制權。

您也可以呼叫 createNotificationChannels(),在單一作業中建立多個通知管道。

設定重要性等級

管道重要性會影響管道中所有通知的干擾程度。請在 NotificationChannel 建構函式中指定重要性,共有五個等級,從 IMPORTANCE_NONE(0) 到 IMPORTANCE_HIGH(4)。

如要支援搭載 Android 7.1 (API 級別 25) 以下版本的裝置,您也必須使用 NotificationCompat 類別的優先順序常數,為每則通知呼叫 setPriority()。

重要性 (NotificationManager.IMPORTANCE_*) 和優先順序 (NotificationCompat.PRIORITY_*) 常數會對應至使用者可見的重要性選項,如下表所示。

使用者可見的重要性等級 重要性 (Android 8.0 以上版本) 優先順序 (Android 7.1 以下版本)
緊急
發出音效並顯示為抬頭通知。
IMPORTANCE_HIGH PRIORITY_HIGH 或 PRIORITY_MAX
高
發出音效。
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
中
不發出聲音。
IMPORTANCE_LOW PRIORITY_LOW
低
不會發出音效,也不會顯示在狀態列中。
IMPORTANCE_MIN PRIORITY_MIN
無
不會發出音效,也不會顯示在狀態列或通知欄中。
IMPORTANCE_NONE N/A

無論重要性為何,所有通知都會顯示在不會造成干擾的系統 UI 位置 (例如通知導覽匣),也會在啟動器圖示上顯示標記 (不過,您可以修改通知標記的外觀)。

將管道提交至 NotificationManager 後,就無法變更重要性等級。不過,使用者隨時可以變更應用程式管道的偏好設定。

如要瞭解如何選擇適當的優先順序,請參閱通知設計指南中的「優先順序」一節。

讀取通知管道設定

使用者可以修改通知管道的設定,包括震動和警示音等行為。如要瞭解使用者對通知管道套用的設定,請按照下列步驟操作:

  1. 呼叫 getNotificationChannel() 或 getNotificationChannels(),取得 NotificationChannel 物件。

  2. 查詢特定管道設定,例如 getVibrationPattern()、getSound() 和 getImportance()。

如果您偵測到某個頻道設定會阻礙應用程式的預期行為,可以建議使用者變更該設定,並提供開啟頻道設定的操作,如下一節所示。

開啟通知管道設定

建立通知管道後,您無法透過程式輔助方式變更通知管道的視覺和聽覺行為。只有使用者可以透過系統設定變更管道行為。如要讓使用者快速存取這些通知設定,請在應用程式的設定 UI 中新增一個項目,用於開啟這些系統設定。

您可以使用 ACTION_CHANNEL_NOTIFICATION_SETTINGS 動作,透過 Intent 開啟通知管道的系統設定。

舉例來說,以下程式碼範例說明如何將使用者重新導向至通知管道的設定:

val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
    putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, CHANNEL_ID)
}
Button(onClick = {
    context.startActivity(intent)
}) {
    Text("Open Channel Settings")
}

請注意,意圖需要兩個額外項目,分別指定應用程式的套件名稱 (也稱為應用程式 ID) 和要編輯的管道。

刪除通知管道

您可以呼叫 deleteNotificationChannel() 來刪除通知管道。下列程式碼範例說明如何完成這項程序:

val notificationManager =
    ContextCompat.getSystemService<NotificationManager>(context, NotificationManager::class.java)
notificationManager?.deleteNotificationChannel(channelId)

建立通知管道群組

如要進一步整理頻道在設定使用者介面中的顯示方式,可以建立頻道群組。如果應用程式支援多個使用者帳戶,建議您採用這種做法,因為您可以為每個帳戶建立通知管道群組。頻道群組可協助使用者區分及控管多個名稱相同的通知頻道。

圖 2. 個人和工作帳戶群組的通知管道設定。

舉例來說,社群網路應用程式可能支援個人和工作帳戶。在這種情況下,每個帳戶可能需要多個功能和名稱相同的通知管道,例如:

  • 擁有兩個頻道的個人帳戶:

    • 新留言

    • 貼文建議

  • 擁有兩個頻道的企業帳戶:

    • 新留言

    • 貼文建議

將通知管道分組,可讓使用者區分各個帳戶。

每個通知管道群組都需要一個 ID,該 ID 在套件中不得重複,且必須有使用者可見的名稱。下列程式碼片段說明如何建立通知管道群組。

fun createNotificationChannelGroup(context: Context, groupId: String, groupName: String) {
    val notificationManager =
        ContextCompat.getSystemService(context, NotificationManager::class.java)
    notificationManager?.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
}

建立新群組後,您可以呼叫 setGroup(),將新的 NotificationChannel 物件與群組建立關聯。

將管道提交至通知管理工具後,就無法變更通知管道與群組之間的關聯。