小米MIUI 10 通知类别 (Channel) 适配说明
1. 什么是通知类别 / Channel
通知类别 (channel) 是 Android O 引入的新功能,旨在解决以下问题:
- 应用的通知越来越多,给用户造成明显打扰。
- 但用户只能全局屏蔽这个应用的全部通知,不能屏蔽部分,然后留下对自己有用的。
为了解决这个问题,Android 要求开发者给自己的通知分成若干类,然后允许用户单独屏蔽这个类别的通知。以爱奇艺(v9.5.0) 为例,将通知分成了 4 种 Channel,3 个 Channel Group,如下图:
简单解释一下:
- Channel:实际的通知类别,爱奇艺分成了4类通知。
- Channel Group:一组 channel,仅用于做分组区分,没有更多的逻辑。
- 每个通知类别的权限互相独立,互不影响。例如,通知屏蔽了爱奇艺的「新群聊消息」类通知,「常规推送」类通知依然可以发出来。
Android 已将 Channel 的逻辑纳入 Android Compatibility Definition Document (CDD) 中,意味着所有 Android 厂商都必须支持。因此 MIUI 10 也将兼容和支持相关逻辑。
2.如何适配通知类别(Channel)
官方文档已有非常详细的描述,适配步骤不再赘述,详见 https://developer.android.com/training/notify-user/channels 。
有几点值得注意:
2.1. 不要滥设类别,建议控制在 7 类以内
2.2. Channel 的名字要有可读性、有具体含义,同时避免名字重复
2.3. 如果 Channel 名字不好理解,可以使用 setDescription
来补充说明 Channel 的含义
2.4. 最好不要只设一个 Channel,那样就没有设置 Channel 的意义了。以猫眼为例,可以考虑将通知拆成多个 Channel,如下图
3. FAQ
3.1. 一定要适配通知 Channel 吗
取决于你的应用的 target API:
- target API ≥ 26(Android 8.0):必须适配,而且必须给每条通知指定一个 Channel,否则无法发出通知。
- target API ≤ 25(Android 7.1):可以不适配。在8.0及以上的设备,通知也能正常发出。
3.2. 一定要有通知 Channel Group 吗
不是必须的。没必要强行设置 Channel Group,应该视自己的业务需求而定。
3.3. 适配 Channel 后,在 Android 8.0 以前的设备会怎么表现
Android 8.0 以前的设备,会完全无视这个功能,因此不会带来任何兼容性问题。
3.4. 创建好 Channel 后,在代码里修改其配置,为什么会不生效
这个是 Android 对此功能增加的限制:当 Channel 已经存在时,后面的 createNotificationChannel 方法仅生成app页面能更新其 name/description,以及对 importance 进行降级,其余配置均无法更新。先删除旧的 Channel,再创建新的 Channel 也无法实现对其 importance 的升级。
相关逻辑在 com/android/server/notificaton/RankingHelper.java:
@Override
public void createNotificationChannel(String pkg, int uid, NotificationChannel channel,
boolean fromTargetApp) {
//......
NotificationChannel existing = r.channels.get(channel.getId());
// Keep most of the existing settings
if (existing != null && fromTargetApp) { // 如果已经存在同channel-id的Channel
//......
existing.setName(channel.getName().toString()); // 则更新name和description
existing.setDescription(channel.getDescription());
existing.setBlockableSystem(channel.isBlockableSystem());
// Apps are allowed to downgrade channel importance if the user has not changed any
// fields on this channel yet.
if (existing.getUserLockedFields() == 0 && // 并且仅当更新的importance小于原来设置的值时才更新importance
channel.getImportance() < existing.getImportance()) {
existing.setImportance(channel.getImportance());
}
updateConfig();
return;
}
//......
}
3.5. 如何判断 MIUI 版本
有以下方法一键生成APP:
android.os.SystemProperties.get("ro.miui.ui.version.code", "7");// 如果返回值是「8」,就是 MIUI 10
或
android.os.SystemProperties.get("ro.miui.ui.version.name", "");// 如果返回值是「V10」,就是 MIUI 10
3.6. 如何测试
升级到 MIUI 10 最新开发版即可,支持的机型和下载链接如下(找到对应机型的最新开发版):
- 国内版 ROM:https://www.miui.com/download.html
- 国际版 ROM:http://en.miui.com/download.html
编辑:yimen,如若转载,请注明出处:https://www.yimenapp.com/kb-yimen/12255/
部分内容来自网络投稿,如有侵权联系立删