顯示具時效性的通知

在某些情況下,應用程式可能需要緊急引起使用者注意,例如鬧鐘響起或接到來電。在搭載 Android 9 (API 級別 28) 以下版本的裝置上,您可能會在應用程式於背景執行時啟動活動,藉此處理這項問題。本文說明如何在搭載 Android 10 (API 級別 29) 以上版本的裝置上,達成這項行為。

新增 POST_NOTIFICATIONS 權限

從 Android 13 (API 級別 33) 開始,請在 AndroidManifest.xml 檔案中宣告 POST_NOTIFICATIONS 權限:

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

宣告權限後,請建立通知管道。

建立通知管道

建立通知管道,顯示通知並讓使用者在系統設定中管理通知類別。如要進一步瞭解通知管道,請參閱「建立及管理通知管道」。

在 Application 類別的 onCreate 方法中建立通知管道:

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        val channel = NotificationChannel(
            CHANNEL_ID,
            "High priority notifications",
            NotificationManager.IMPORTANCE_HIGH
        )

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }
}

使用者首次執行應用程式時,系統會在「應用程式資訊」畫面中顯示管道,如圖 1 所示:

「應用程式資訊」通知畫面,顯示已建立的管道。
圖 1. 應用程式系統設定的「應用程式資訊」畫面中的「通知」部分。

管理通知權限

從 Android 13 開始,您必須先要求通知權限,才能向使用者顯示通知。

以下程式碼範例說明如何在 Jetpack Compose 中要求執行階段通知權限:

val permissionLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.RequestPermission(),
    onResult = { hasNotificationPermission = it }
)
// ...
Button(
    onClick = {
        if (!hasNotificationPermission) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
            }
        }
    },
) {
    Text(text = "Request permission")
}

在搭載 Android 13 以上版本的裝置上,輕觸「要求權限」按鈕會顯示圖 2 所示的系統對話方塊:

提示使用者允許通知的系統對話方塊。
圖 2. 通知權限要求系統對話方塊。

使用者授予權限後,系統會更新「應用程式資訊」畫面,如圖 3 所示:

「應用程式資訊」畫面,顯示已授予的通知權限。
圖 3. 已授予通知權限。

建立高優先順序通知

建立高優先順序通知時,請提供清楚的標題和訊息文字。並指派高重要性管道和優先順序。

下列程式碼範例會設定及建構高優先權通知:

private fun showNotification() {
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

    val notificationBuilder =
        NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.baseline_auto_awesome_24)
            .setContentTitle("HIGH PRIORITY")
            .setContentText("Check this dog puppy video NOW!")
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setCategory(NotificationCompat.CATEGORY_RECOMMENDATION)

    notificationManager.notify(0, notificationBuilder.build())
}

向使用者顯示通知

呼叫 showNotification 函式會觸發通知,如下所示:

Button(onClick = { showNotification() }) {
    Text(text = "Show notification")
}

圖 4 顯示系統顯示的高優先順序通知:

裝置上顯示高優先順序通知。
圖 4. 高優先順序通知。

持續性通知

向使用者顯示通知時,他們可以確認或關閉應用程式的警示或提醒。舉例來說,使用者可以接聽或拒接來電。

如果通知代表持續進行的背景工作 (例如通話中),請將通知與前景服務建立關聯。下列程式碼片段說明如何顯示與前景服務相關聯的通知:

// Provide a unique integer for the "notificationId" of each notification.
startForeground(notificationId, notification)

考慮使用即時更新

具時效性的持續性通知可透過提高曝光度來發揮效益。 建議將持續性通知升級為「最新即時資訊」,在系統 UI 介面中顯示狀態資訊。