一、Notification前世今生:Android通知机制发展史
说起Android通知,我做了这么多年项目,感触还挺深的。早期那会儿,通知就是个简单的弹条,能显示个标题和内容就不错了。现在呢?通知已经变成了一个完整的交互系统——支持富媒体、快捷回复、分组管理,甚至还能控制智能家居。
说白了,通知机制的演进,就是Android系统从“能用”到“好用”的一个缩影。你想想看,一个App如果通知管理得乱七八糟,用户第一反应就是——卸载。所以搞懂通知的历史,不是为了考古,而是为了理解为什么今天要这么设计。
1.1 从Android 1.0到4.4:通知的蛮荒时代
我记得最早接触Android 2.3那会儿,通知栏就是个简单的列表。开发者能做的很有限:设置个图标、标题、内容,最多加个PendingIntent让用户点击跳转。那时候的通知,说白了就是个“消息展示器”。
到了Android 4.1(Jelly Bean),Google终于做了件好事——引入了可展开通知。用户可以用双指手势展开通知,看到更多内容。嗯,这个设计到现在还在用。
Android 4.4(KitKat)又加了个小功能:通知可以显示进度条。我在项目里做过一个下载器,那时候为了显示下载进度,得自己写个自定义布局塞进通知里,挺麻烦的。
- Android 1.0-2.3:基础通知,仅支持文本+图标
- Android 4.1:引入可展开通知(BigTextStyle、BigPictureStyle)
- Android 4.4:支持进度条显示
1.2 Android 5.0 Lollipop:通知的转折点
Android 5.0是个分水岭。为什么这么说?因为Material Design来了。通知不再是一个灰不溜秋的条,而是有了卡片式设计、阴影、圆角。视觉上舒服多了。
更重要的是,5.0引入了锁屏通知和通知优先级。开发者可以设置通知的可见级别(公开、私密、秘密),还能控制通知在锁屏上显示多少内容。我在做金融类App时,这个功能特别有用——交易提醒可以显示金额,但验证码必须隐藏。
优先级系统有5个级别:
| 优先级 | 常量 | 说明 |
|---|---|---|
| 最低 | PRIORITY_MIN | 仅显示在通知列表底部,无声音振动 |
| 低 | PRIORITY_LOW | 不弹出,安静显示 |
| 默认 | PRIORITY_DEFAULT | 正常显示 |
| 高 | PRIORITY_HIGH | 弹出显示,可能伴有声音 |
| 最高 | PRIORITY_MAX | 强制弹出,常用于紧急通知 |
但说实话,这个优先级系统有个问题——它是由开发者控制的。你想想看,哪个开发者会把自己的通知设成低优先级?结果就是所有通知都往高了设,用户根本没法区分哪些是重要的。
1.3 Android 8.0 Oreo:NotificationChannel的诞生
终于说到重点了。Android 8.0(API 26)引入了NotificationChannel,这是通知机制史上最大的一次变革。为什么Google要搞这个?
我举个例子你就明白了。假设你装了个电商App,它给你推送三类消息:订单通知、促销广告、系统公告。在8.0之前,你只能要么全收,要么全关。想关掉促销广告但保留订单通知?没门。
NotificationChannel就是来解决这个问题的。它让用户来控制通知的开关和表现,而不是开发者。每个Channel可以独立设置:
- 重要性级别(IMPORTANCE_HIGH、IMPORTANCE_DEFAULT等)
- 声音、振动模式
- 是否显示角标
- 是否在锁屏上显示
- 是否闪烁LED灯
而且,一旦用户关闭了某个Channel,开发者代码里再怎么发通知也没用。这个设计很聪明——把控制权还给了用户。
1.4 Android 9-14:通知机制的持续进化
Android 9(Pie)引入了通知分组和快捷回复。聊天类App终于可以在通知栏直接回复消息了,不用跳转进App。我记得当时适配这个功能时,还得处理RemoteInput的兼容性问题,挺折腾的。
Android 10(Q)加了智能回复,系统会自动分析消息内容生成回复建议。嗯,这个功能现在微信、钉钉都在用。
Android 12(Snow Cone)搞了个大新闻——通知设计大改。通知变成了圆角卡片,颜色更柔和,还支持了动态主题适配。同时,Google开始限制通知的滥用行为:如果App频繁发送低质量通知,系统会提示用户关闭该App的通知权限。
Android 13(Tiramisu)引入了运行时通知权限。以前用户只能在设置里关通知,现在App第一次发送通知时,系统会弹窗询问用户是否允许。这个变化影响很大——新安装的App默认没有通知权限,必须用户主动授权。
Android 14(Upside Down Cake)进一步收紧了通知权限:如果App的目标SDK是34或以上,必须声明POST_NOTIFICATIONS权限,并且用户拒绝后App不能反复请求。
1.5 为什么NotificationChannel如此重要?
说了这么多历史,我们来总结一下NotificationChannel的诞生背景:
- 用户控制权回归:以前开发者说了算,现在用户说了算
- 通知分类管理:不同类型通知可以独立设置
- 减少通知骚扰:用户可以把不重要的通知静音,只保留关键通知
- 系统层面支持:Channel是系统级功能,比开发者自己实现的通知管理更稳定
说白了,NotificationChannel就是Android通知机制的“分水岭”。8.0之前的通知管理是“一刀切”,8.0之后变成了“精细化管理”。
下面这张图展示了通知机制的核心演进脉络:
好了,这一章我们聊了通知机制从诞生到现在的演变过程。下一章我会带你手把手实现第一个NotificationChannel,包括代码怎么写、Channel怎么规划、兼容性怎么处理。到时候见。
公众号:蓝海资料掘金营,微信deep3321