环境搭建与基础概念:NotificationManager获取、NotificationCompat.Builder基础用法、创建第一条通知

好,咱们正式开始动手了。这一章我带你走完最基础的一步——把第一条通知发出来。别小看这个流程,里面藏着不少坑。我当年第一次写通知时,愣是折腾了半小时没看到通知弹出来,后来才发现是忘了检查渠道配置。嗯,咱们一步步来。

1. 获取NotificationManager

说白了,NotificationManager就是系统里负责管理通知的总管家。你要发通知、取消通知、更新通知,都得通过它来操作。

获取方式很简单,就一行代码:

NotificationManager notificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

这里有个细节——getSystemService()是Context的方法。你在Activity里可以直接调,如果在Fragment或者自定义View里,记得先拿到Context。我见过不少新手在Adapter里直接写getSystemService(),结果编译报错,一脸懵。

小提示:从Android 8.0(API 26)开始,所有通知都必须绑定一个通知渠道(NotificationChannel)。如果你没创建渠道就直接发通知,系统会直接忽略掉,连个错误日志都不给。我第一次踩这个坑时,查了半小时源码才找到原因。

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建议设置,影响通知在状态栏的展示行为
注意:setSmallIcon只能用纯alpha位图的图标,不能用彩色图。如果你传了一张彩色图进去,系统会把它压缩成单色,效果往往很难看。我建议你准备一套专门的通知图标,尺寸推荐24x24dp。

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对应哪条通知。

核心流程总结:
  1. 获取NotificationManager实例
  2. 创建NotificationChannel(8.0+)
  3. 使用NotificationCompat.Builder构建通知对象
  4. 调用notificationManager.notify()发出通知

5. 知识体系一览

我把这一章的核心逻辑画成了图,方便你理解整个流程:

通知发送核心流程 获取NotificationManager getSystemService() 创建通知渠道 NotificationChannel 构建通知对象 NotificationCompat.Builder 发出通知 notify(id, notification) 注意事项 • setSmallIcon 必须设置 • 渠道ID必须一致 • 8.0+ 必须创建渠道 ✅ 通知出现在状态栏

6. 避坑指南

最后,我把自己这些年踩过的坑总结一下:

  • 渠道一旦创建,importance就不能改了。用户可以在设置里改,但你的代码改不了。所以第一次创建渠道时,importance要想清楚。
  • 通知ID不要重复。如果你用同一个ID发两条不同的通知,后一条会覆盖前一条。我见过有人用System.currentTimeMillis()当ID,结果毫秒级重复导致通知丢失。
  • 模拟器上可能看不到通知。有些模拟器默认关闭了通知栏,或者通知渠道被静音了。真机测试最靠谱。
  • 别忘了在AndroidManifest里声明权限。虽然发通知不需要额外权限,但如果你要用POST_NOTIFICATIONS权限(Android 13+),记得在清单文件里声明,并且动态申请。

好了,这一章的内容就到这里。你现在应该能成功发出第一条通知了。去试试看,有问题随时回来翻翻这张图。


公众号:蓝海资料掘金营,微信deep3321