在某些情况下,您的应用可能需要立即引起用户的注意,例如闹钟正在响铃或有来电时。在搭载 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 所示:
管理通知权限
从 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 所示的系统对话框:
当用户授予权限后,系统会更新应用信息界面,如图 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 显示了系统显示的高优先级通知:
持续性通知
向用户显示通知时,他们可以确认或关闭应用的提醒。例如,用户可以接受或拒绝来电。
如果您的通知表示正在进行的后台任务(例如正在进行的通话),请将该通知与前台服务相关联。以下代码段展示了如何显示与前台服务关联的通知:
// Provide a unique integer for the "notificationId" of each notification. startForeground(notificationId, notification)
考虑使用“实时动态”功能
时间敏感型持续性通知可以受益于更高的可见性。 考虑将持续性通知推广为实时动态,以便在整个系统界面上显示状态信息。