环境搭建与基础概念:NotificationManager获取、NotificationCompat.Builder基础用法、创建第一条通知
好,咱们正式开始动手了。这一章我带你走完最基础的一步——把第一条通知发出来。别小看这个流程,里面藏着不少坑。我当年第一次写通知时,愣是折腾了半小时没看到通知弹出来,后来才发现是忘了检查渠道配置。嗯,咱们一步步来。
1. 获取NotificationManager
说白了,NotificationManager就是系统里负责管理通知的总管家。你要发通知、取消通知、更新通知,都得通过它来操作。
获取方式很简单,就一行代码:
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
这里有个细节——getSystemService()是Context的方法。你在Activity里可以直接调,如果在Fragment或者自定义View里,记得先拿到Context。我见过不少新手在Adapter里直接写getSystemService(),结果编译报错,一脸懵。
2. NotificationCompat.Builder——你的通知建造师
创建通知对象,我们用的是NotificationCompat.Builder。为什么用Compat版本?因为它能帮你自动处理不同Android版本的兼容性问题。你想想看,要是每个版本都写一套逻辑,那代码得多恶心。
基本用法如下:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "default_channel_id")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("你好,世界")
.setContentText("这是我的第一条通知")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
这里有几个关键点:
- 第一个参数是Context,传this就行
- 第二个参数是渠道ID,必须和你创建的渠道ID一致
- setSmallIcon是必填项,不设的话通知发不出来
- setPriority建议设置,影响通知在状态栏的展示行为
3. 创建通知渠道(Android 8.0+)
刚才说了,8.0以上必须要有渠道。创建渠道的代码通常放在Application的onCreate()里,或者你第一次发通知之前调用一次就行。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
"default_channel_id",
"默认通知",
NotificationManager.IMPORTANCE_DEFAULT
);
channel.setDescription("这是默认的通知渠道");
notificationManager.createNotificationChannel(channel);
}
渠道的importance参数决定了通知的表现形式:
| 重要性级别 | 行为表现 | 使用场景 |
|---|---|---|
| IMPORTANCE_HIGH | 弹出横幅、有声音 | 重要消息、来电 |
| IMPORTANCE_DEFAULT | 有声音,不弹出横幅 | 普通通知 |
| IMPORTANCE_LOW | 无声音,不弹出横幅 | 后台服务通知 |
| IMPORTANCE_MIN | 折叠在底部,几乎不可见 | 静默通知 |
我个人习惯把渠道的importance设得稍微高一点,因为用户可以在系统设置里手动调低。但如果你一开始设得太低,用户可能根本不知道你的通知存在。
4. 发出第一条通知
好,所有准备工作就绪,现在真正发通知:
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 创建渠道(仅8.0以上需要)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
"default_channel_id",
"默认通知",
NotificationManager.IMPORTANCE_DEFAULT
);
notificationManager.createNotificationChannel(channel);
}
// 构建通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "default_channel_id")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("第一条通知")
.setContentText("恭喜你,成功发出了第一条通知!")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
// 发出通知,第二个参数是通知ID
notificationManager.notify(1001, builder.build());
这里notify()的第一个参数是通知ID,类型是int。这个ID用来标识这条通知,后续你要更新或取消通知时,用的就是同一个ID。我建议你用一个常量或者枚举来管理这些ID,别写死数字,不然项目大了以后根本分不清哪个ID对应哪条通知。
- 获取NotificationManager实例
- 创建NotificationChannel(8.0+)
- 使用NotificationCompat.Builder构建通知对象
- 调用notificationManager.notify()发出通知
5. 知识体系一览
我把这一章的核心逻辑画成了图,方便你理解整个流程:
6. 避坑指南
最后,我把自己这些年踩过的坑总结一下:
- 渠道一旦创建,importance就不能改了。用户可以在设置里改,但你的代码改不了。所以第一次创建渠道时,importance要想清楚。
- 通知ID不要重复。如果你用同一个ID发两条不同的通知,后一条会覆盖前一条。我见过有人用
System.currentTimeMillis()当ID,结果毫秒级重复导致通知丢失。 - 模拟器上可能看不到通知。有些模拟器默认关闭了通知栏,或者通知渠道被静音了。真机测试最靠谱。
- 别忘了在AndroidManifest里声明权限。虽然发通知不需要额外权限,但如果你要用
POST_NOTIFICATIONS权限(Android 13+),记得在清单文件里声明,并且动态申请。
好了,这一章的内容就到这里。你现在应该能成功发出第一条通知了。去试试看,有问题随时回来翻翻这张图。