一、基本概念和组成部分
Android 通知是应用向用户传递重要信息的主要方式,通常显示在状态栏、锁屏或通知抽屉中。其核心组成部分包括:
- 图标(Small Icon):必须设置,代表通知来源的应用。
- 标题(Title):简要说明通知内容。
- 内容(Content Text):详细描述通知信息。
- 优先级(Priority):决定通知的显示位置和方式(高、中、低等)。
- 渠道(Channel):Android 8.0+ 要求按类别分组通知。
- 操作按钮(Actions):允许用户直接响应(如回复、删除)。
- 点击事件(PendingIntent):用户点击通知后的响应动作。
二、版本兼容性
1、通知渠道(Android 8.0+,API 26)
-
功能:用户可按渠道管理通知的优先级、声音和振动。
-
适配策略:
- 创建通知前必须定义渠道。
- 使用
NotificationManagerCompat
兼容库简化操作。
kotlin
// 创建通知渠道(仅需调用一次)
fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
"channel_id",
"Channel Name",
NotificationManager.IMPORTANCE_DEFAULT
).apply {
description = "Channel Description"
}
val manager = context.getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
}
2、旧版本兼容
- 使用
NotificationCompat.Builder
确保兼容性
kotlin
val builder = NotificationCompat.Builder(context, "channel_id")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("Title")
.setContentText("Content")
三、权限问题
-
Android 13(API 33+) :需要动态请求
POST_NOTIFICATIONS
权限。 -
权限处理步骤:
-
声明权限 (
AndroidManifest.xml
):xml<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
-
运行时请求:
kotlinif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), REQUEST_CODE) }
-
四、使用示例
1、构建并发送通知
kotlin
fun sendNotification(context: Context) {
// 创建点击意图(打开Activity)
val intent = Intent(context, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
// 构建通知
val notification = NotificationCompat.Builder(context, "channel_id")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("New Message")
.setContentText("You have a new message from Alice.")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setAutoCancel(true) // 点击后自动移除
.build()
// 发送通知
NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, notification)
}
2、处理用户点击
- 通过
PendingIntent
跳转指定页面或执行操作(如启动服务)。
五、不同通知样式
1、大文本样式(BigTextStyle)
kotlin
NotificationCompat.Builder(context, "channel_id")
.setStyle(NotificationCompat.BigTextStyle()
.bigText("Long text that expands when notification is expanded..."))
2、收件箱样式(InboxStyle)
kotlin
NotificationCompat.Builder(context, "channel_id")
.setStyle(NotificationCompat.InboxStyle()
.addLine("Message 1")
.addLine("Message 2"))
3、媒体控制样式
kotlin
NotificationCompat.Builder(context, "channel_id")
.setStyle(MediaStyle()
.setMediaSession(mediaSession.sessionToken))
4、进度条样式
kotlin
val notification = NotificationCompat.Builder(context, "channel_id")
.setProgress(100, progress, false) // 不确定进度使用setIndeterminate(true)
六、测试策略
- 多版本测试:在 Android 8.0+ 和旧版本设备上验证通知行为。
- 通知渠道验证:检查渠道设置是否生效(用户可手动调整渠道设置)。
- 点击事件测试 :确保
PendingIntent
正确触发目标组件。 - 权限测试:在 Android 13+ 设备上测试权限请求流程。
- 日志监控 :使用 Logcat 跟踪
NotificationManager
相关日志。
七、常见问题处理
1、通知不显示
-
可能原因:
- 未创建通知渠道(Android 8.0+)。
- 未设置
SmallIcon
。 - 用户关闭了应用的通知权限。
-
解决:
- 检查渠道创建代码。
- 确保
setSmallIcon
已设置。 - 引导用户开启通知权限。
2. 点击通知无响应
-
**可能原因:
PendingIntent
的Intent
或Flags
配置错误。- 目标组件未在
AndroidManifest.xml
中注册。
-
解决:
- 检查
PendingIntent
的FLAG_IMMUTABLE
或FLAG_UPDATE_CURRENT
。 - 确认
Activity
/Service
已声明。
- 检查
3、样式不生效
-
可能原因:
- 未调用
setStyle()
方法。 - 设备不支持该样式(如旧版本)。
- 未调用
-
解决:
- 确保使用
NotificationCompat
的样式类。
- 确保使用
八、总结
-
核心要点:通知渠道、动态权限、兼容性处理。
-
最佳实践:
- 使用
NotificationCompat
和NotificationManagerCompat
。 - 按功能划分通知渠道(如"聊天"、"促销")。
- 提供清晰的用户操作入口(如关闭通知的引导)。
- 使用
-
持续适配:关注 Android 新版本的通知策略变化(如 Android 13 的权限模型)。