显示有时效性的通知

在某些情况下,您的应用可能需要紧急引起用户的注意,例如闹钟正在响或有来电。在搭载 Android 9(API 级别 28)或更低版本的设备上,您可以通过在应用处于后台时启动 activity 来处理此问题。本文档介绍了如何在搭载 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)

考虑使用实时动态

具有时效性的持续性通知可以受益于更高的可见性。 考虑将持续性通知提升为实时动态,以便在系统界面中显示状态信息。