二、创建基础通知:NotificationCompat.Builder、渠道ID、小图标、标题、正文、优先级设置
2.1 原理:通知的构成要素与 Builder 模式
Android 通知(Notification)是一种在系统状态栏呈现的消息载体,其核心构成要素包括渠道(Channel)、小图标(Small Icon)、标题(Title)、正文(Body)和优先级(Priority)。这些要素通过 NotificationCompat.Builder 对象以 Builder 模式 逐步装配,最终由 NotificationManager 提交至系统。
关键概念:NotificationCompat.Builder 是 AndroidX 库提供的跨版本构建器,自动适配 Android 8.0(API 26)以上的渠道机制与低版本兼容逻辑。所有通知必须绑定一个已注册的渠道 ID,否则在高版本设备上通知将静默丢弃。
2.2 实现流程:三步构建一条基础通知
创建一条基础通知遵循三步法,任何遗漏都可能导致通知无法显示。
- 注册通知渠道(Android 8.0+ 必须)—— 创建
NotificationChannel对象并调用createNotificationChannel()。 - 构建通知对象—— 使用
NotificationCompat.Builder设置渠道 ID、小图标、标题、正文和优先级。 - 发布通知—— 通过
NotificationManager.notify()提交,需传入唯一 ID 与通知对象。
📌 最佳实践:通知 ID 建议使用
System.currentTimeMillis() 保证唯一性,或在应用内维护一个递增计数器。渠道 ID 一经发布不应更改,否则旧通知会失去渠道归属。
2.3 核心 API 详解:NotificationCompat.Builder
下表列出构建基础通知时最常用的 API 方法,每个方法都有其版本兼容性要求。
| 方法 | 参数说明 | 版本要求 | 备注 |
|---|---|---|---|
setSmallIcon(int icon) | 图标资源 ID(必须为白色单色) | API 1+ | 必须设置,否则通知不显示 |
setContentTitle(CharSequence) | 通知标题(一行) | API 1+ | 建议 ≤ 40 字符 |
setContentText(CharSequence) | 通知正文(两行以内) | API 1+ | 超长文本会被截断 |
setPriority(int pri) | PRIORITY_HIGH / PRIORITY_DEFAULT 等 | API 1+ | API 26+ 由渠道重要性替代 |
setChannelId(String) | 渠道 ID(必须预先注册) | API 26+ | 低版本自动忽略 |
build() | 无参 | API 1+ | 返回 Notification 实例 |
⚠️ 优先级兼容性陷阱:在 Android 8.0(API 26)以上设备,
setPriority() 不再生效,通知的打扰级别由渠道的 importance 决定。如果渠道重要性设为 IMPORTANCE_LOW,即使代码中设置了 PRIORITY_HIGH,通知也不会弹出横幅。建议在渠道创建时直接设置 IMPORTANCE_HIGH 以获得头部提醒效果。
2.4 完整代码示例:发送一条高优先级通知
以下代码演示了从渠道注册到通知发布的完整链路,要求应用已导入 AndroidX 核心库。
// 1. 创建通知渠道(仅在 API 26+ 需要)
NotificationManager manager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
"alerts", // 渠道 ID
"重要提醒", // 用户可见的渠道名称
NotificationManager.IMPORTANCE_HIGH // 高重要性
);
channel.setDescription("用于接收应用的重要提醒通知");
manager.createNotificationChannel(channel);
}
// 2. 使用 Builder 构建通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "alerts")
.setSmallIcon(R.drawable.ic_notify_alert) // 必须设置
.setContentTitle("内存使用超过 85%")
.setContentText("建议立即清理后台进程,以免系统卡顿。")
.setPriority(NotificationCompat.PRIORITY_HIGH); // API 26+ 由渠道控制
// 3. 发布唯一通知
int uniqueId = (int) System.currentTimeMillis();
manager.notify(uniqueId, builder.build());
2.5 调试与验证方法
- Logcat 过滤:关键字
NotificationService或NotificationChannel,查看渠道注册是否成功。 - adb 命令检查渠道:
adb shell dumpsys notification --list-channels com.your.package可列出已注册渠道及其重要性。 - 系统设置验证:进入 设置 → 通知与状态栏 → 应用通知,查看目标应用的开关及渠道列表。
- 常见失败表现:通知图标为空白方块(小图标不符合规范) / 通知完全不出现(渠道未注册或重要性为 NONE)。
2.6 常见错误与避坑指南
| 错误场景 | 产生原因 | 解决方案 |
|---|---|---|
| 通知不显示,无任何日志 | 渠道未注册或重要性为 IMPORTANCE_NONE | 注册渠道时使用 IMPORTANCE_HIGH 或 IMPORTANCE_DEFAULT |
| 小图标显示为白色方块 | 图标使用了彩色或带有透明背景的 PNG | 只使用纯白色前景 + 透明背景的矢量/PNG |
| 通知没有声音/震动 | 渠道重要性过低或未配置声音属性 | 设置 channel.setSound() 或启用震动 |
| 渠道 ID 不匹配 | Builder 中渠道 ID 与注册时不一致 | 统一使用同一个字符串常量 |
| 低版本手机通知崩溃 | 调用了 API 26+ 专属渠道方法 | 添加 Build.VERSION.SDK_INT 判断 |
2.7 性能与稳定性优化
- 避免频繁创建渠道:渠道注册应在
Application.onCreate()或主 Activity 的初始化阶段一次性完成,不要在每次通知发送前重复注册。 - 图标资源缓存:小图标使用
R.drawable静态资源,不要动态生成 Bitmap 作为小图标,防止内存抖动。 - 控制通知正文长度:正文建议限制在 80 字符以内,长文本使用
setStyle(new NotificationCompat.BigTextStyle())展开。 - 通知去重:对于相同内容的通知,应复用通知 ID(如使用固定 ID 更新已有通知),避免通知栏堆积。
- 渠道持久化:渠道创建后系统会自动持久化,升级应用时不要更改已有渠道的 ID,否则会丢失用户对该渠道的偏好设置。
📱 实战检查清单
✅ 渠道 ID 使用字符串常量,硬编码在
✅ 小图标为纯白色矢量图,尺寸 24x24dp(Android Studio 内置 Asset Studio 可生成)
✅ 优先级与渠道重要性逻辑统一:高打扰需求 → IMPORTANCE_HIGH + PRIORITY_HIGH
✅ 通知 ID 使用正整型,避免使用 0(系统保留值)
✅ 已经过 Android 8.0 / 10 / 12 真机验证
✅ 渠道 ID 使用字符串常量,硬编码在
res/values/strings.xml 中✅ 小图标为纯白色矢量图,尺寸 24x24dp(Android Studio 内置 Asset Studio 可生成)
✅ 优先级与渠道重要性逻辑统一:高打扰需求 → IMPORTANCE_HIGH + PRIORITY_HIGH
✅ 通知 ID 使用正整型,避免使用 0(系统保留值)
✅ 已经过 Android 8.0 / 10 / 12 真机验证