通知为什么要渠道

安卓 8.0 以后,发通知必须先建"渠道"。渠道把通知分类:聊天、推送、营销各自一个通道,用户可以单独开关。没有渠道,通知发不出去。

先建渠道,再发通知。

这篇从建渠道到发一条可点击的通知走一遍。

通知是用户对你 App 的第一印象:太频繁被关掉,太少又被忘掉。正确做法是按场景分渠道,聊天消息设高优先级带声音,营销推送设低优先级静默,用户可以在设置里分别调。一个 App 最好别全塞进一个默认渠道,否则一被关掉,所有提醒都没了。

建一个通知渠道

val ch = NotificationChannel("msg", "消息", NotificationManager.IMPORTANCE_HIGH)
manager.createNotificationChannel(ch)
通知速查
  • channelId渠道唯一标识。
  • IMPORTANCE决定打扰程度。
  • createNotificationChannel注册渠道。

渠道一旦建好就不能改它的重要级别,改了也不会生效,所以新建时想清楚再建。名字和描述要写给用户看,他们会在系统设置里看到。

从 Android 13 起还要在运行时请求通知权限,用户允许了才能真正弹出来。

发一条通知

val n = NotificationCompat.Builder(this, "msg")
  .setSmallIcon(R.drawable.ic_msg)
  .setContentTitle("新消息")
  .setContentText("你有一条新私信")
  .build()
manager.notify(1, n)

第一个参数是通知 id,相同 id 的通知会互相覆盖。想在通知栏叠着多条,就给每条不同的 id。发完通知可以设自动消失时间,也可以加个进度条显示下载或同步进度。

点击通知跳转

用 PendingIntent 包装一个启动页,挂到通知上,点通知就打开对应页面。

PendingIntent 分三种:getActivity 开 Activity、getBroadcast 发广播、getForegroundService 起服务。点通知跳详情页用 getActivity。记得给 PendingIntent 传唯一的 requestCode 和 Intent 里的 extra,否则多个通知可能跳同一个页面。通知里的 action 按钮也是挂一个 PendingIntent,点一下直接触发对应动作。

安卓通知:手机顶部弹出数张悬浮通知卡片、卡片上有占位头像与横线图形、周围环绕发光波纹的蓝调插画
手机顶部弹出悬浮通知卡片,点一下就跳进对应页面。