机型适配这种东西每隔两三年就会有新变化。以下为整理的主流机型发方案。随厂商变动不定期更新。
我会尽量寻找手机厂商给出的官方适配方案,下文会贴出官方对应的文档链接。由于部分机型对应厂商没有给出官方适配方案,我会在文中说明。
一,google 官方适配文档
官方文档:修改通知标志
google没有提供数字角标,而是显示圆点的方式。原则上只要向通知栏发送了一条通知 ,应用图标的右上角就会显示圆点。
同时,google还提供了停用角标的方案:
在某些情况下,您的通知并不适合显示标志,您可以通过对 NotificationChannel 对象调用 setShowBadge(false),针对每个渠道停用标志。
例如,您可能希望在以下情况下停用通知标志:
—— 持续显示的通知:大多数持续显示的通知(例如图片处理、媒体播放控件或当前导航说明)都不适合显示为标志。
—— 日历提醒:避免当前时间发生标志事件。
—— 时钟或闹钟事件:避免与当前闹钟相关的标志通知。
google的角标是在api26引入的,但是国内厂商基本都做了适配更新,使得一些低于api26的设备也可以生效。
华为
官方文档:华为桌面角标开发指导书
前提:需要EMUI4.1 及以上。
需要声明权限:
< uses - permission android: name = \"android.permission.INTERNET\" / >< uses - permission android: name = \"com.huawei.android.launcher.permission.CHANGE_BADGE \" / >
设置数字角标:
Bundle extra = new Bundle();extra.putString(\"package\", \"xxxxxx\");extra.putString(\"class\", \"yyyyyyy\");extra.putInt(\"badgenumber\", i);context.getContentResolver().call(Uri.parse(\"content://com.huawei.android.launcher.settings/badge/\"), \"change_badge\", null, extra);
关键参数说明:
package:应用包名
class:桌面图标对应的应用入口Activity类
badgenumber:角标数字 badgenumber为0时,不显示角标
小米
官方文档:MIUI 6 至 MIUI 11 桌面角标适配说明
-
默认逻辑
当应用向通知栏发送了一条通知 (除了进度条样式和常驻通知外),应用图标的右上角就会显示「1」。值得一提,角标的数字代表应用的通知数,即应用发送了「x」条通知,角标就会显示为「x」。(这一点和google的方案基本一致) -
开发者如何自定义角标数
如果开发者不满意默认逻辑,想要自定义角标的数字,可以通过调用接口告知系统,参考代码如下:
try {Field field = notification.getClass().getDeclaredField(“extraNotification”);Object extraNotification = field.get(notification);Method method = extraNotification.getClass().getDeclaredMethod(“setMessageCount”, int.class);method.invoke(extraNotification, mCount);} catch (Exception e) {e.printStackTrace();}
oppo
在很多早期的博客中都说oppo没有角标方案,实际上oppo有提供角标适配方案。但是实际上它的方案比华为和小米繁琐的多。
不得不说oppo开放平台的文档分类设计的有点反人类,找了很久都没有找到对应的资料。最后还是通过oppo开发者社区询问官方人员才得到答案。
1、oppo没有像华为那样手动更新角标数字的方案,它是通过发送的通知的数量来显示数字的。
2、并不是有通知就显示,还有两个个前提:
- 通知通道(Channel)适配
- 接入Opush OPPO PUSH服务开启指南,内含申请功能的说明。
好消息是opush的基础服务目前是免费的。
附oppo开发者社区询问截图
VIVO
不支持。对,就是这么直接。
我在vivo的官方网站没有发现角标的说明文档,就发了邮件到vivo官方邮箱。以下为vivo恢复的邮件截图
好吧,既然他们说暂未开放,但是已经在筹划了,那就先关注一段时间,说不定半年后就出新方案了。
zuk
官方文档:应用图标动态角标显示
没想到vivio都没有的服务联想居然提供了。聊胜于无
魅族
未找到官方文档。
不过根据实际测试效果来看,是走的google的路子。即发送通知到通知栏就可以了。实际请参考goole的做法。
一加
未找到官方文档。
由于没有一加的手机,猜测要么也是goole的适配方案。不过考虑到一加用的opush的推送,也有可能走oppo的适配方案。
三星
我丢人了,三星的中文文档太少了,少数的折叠屏适配的、钻孔屏适配的就没什么文档了。去外网找,是韩文的?惹不起惹不起。从国内的博客找了适配方案,试了试可以用
String launcherClassName = getLauncherClassName(context);Intent intent = new Intent(\"android.intent.action.BADGE_COUNT_UPDATE\");intent.putExtra(\"badge_count\", count);intent.putExtra(\"badge_count_package_name\", context.getPackageName());intent.putExtra(\"badge_count_class_name\", launcherClassName);context.sendBroadcast(intent);
sony
比三星都不如,连一篇技术文档都没找到。这手机业务已经死了吧。
抄一篇方案,有没有效没试过
final Intent intent = new Intent();intent.putExtra(\"com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE\", 0 < number);intent.setAction(\"com.sonyericsson.home.action.UPDATE_BADGE\");intent.putExtra(\"com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME\", getLauncherClassName(context));intent.putExtra(\"com.sonyericsson.home.intent.extra.badge.MESSAGE\",String.valueOf(number > 999 ? 999 : number));//数字intent.putExtra(\"com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME\", context.getPackageName());context.sendBroadcast(intent);