有关 Android 应用桌面角标 (BadgeNumber) 实现的探讨

原创 2017年11月28日 00:00:00

【回复“1024”,送你一个特别推送】

?wxfrom=5&wx_lazy=1


原文作者:小强-贝聊移动

原文地址:http://www.jianshu.com/p/199a9238015f

特别声明:本文为小强-贝聊移动原创并授权发布,未经原作者允许请勿转载,转载请联系原作者

作者:小强 贝聊移动开发部 Android 工程师

前言:本文主要讲述了以下三方面:

  1. 怎么在 Android 系统下让自家的应用图标像 iOS 系统那样支持数字角标的显示?

  2. 在网上找不到现成的解决方案的情况下,该如何去寻找问题的突破口?

  3. 一种简洁性和扩展性都比较高的封装思路。

先放一个传送门:https://github.com/beiliao-mobile/BadgeNumberManager

1.Android 系统下如何支持应用桌面角标 (BadgeNumber)的显示

?

其实本来 Android 原生系统是不支持应用桌面角标 (BadgeNumber) 显示的。我们目前看到的能支持应用桌面角标显示的 Android 系统,都是第三方厂商自己定制的。通过实现一套自己的launcher并且提供外部接口给第三方应用来调用即可。

我们公司的 APP 里涉及到 IM 的功能。所以经常会有用户向客服反馈,为什么 QQ、微信都支持应用桌面角标的显示,但你们的 APP 却不行...... 本着用户就是上帝的原则,于是应用桌面角标显示的优化就提上了日程。其实,测试部门在之前就已经跟我们提过这事了,只不过当时正忙于项目开发,没时间优化。前段时间需求不多的时候,给公司的 Android 应用加上了桌面角标显示的支持。现在将这个优化的过程总结一下。

   目前已经存在的开源库

如果大家有接触过这方面的优化,应该很快就可以在搜索引擎上找到某个被推荐次数较多的开源库 ShortcutBadger:https://github.com/leolin310148/ShortcutBadger

?

虽然这个库适配的覆盖机型貌似很多,但在实际的测试中发现,某些方法可能对于目前市面上的国产流行机型已经不奏效了。所以,不建议大家直接将这个开源项目用到项目中去。作为学习和参考倒是一个不错的选择。而且,在实际方案抉择的过程中,我们发现,公司的 APP 主流机型排行榜中,前十的机型几乎被 OPPO、vivo、华为、小米这四个品牌屠榜了。所以,我们的优化目标暂时就先定下来了:先集中精力适配市面上的这四个主流品牌机型。其他的冷门机型,后面再慢慢完善。(其实实际上我们也找不来那么多冷门的机型进行测试,所以对于没自身确认过奏效的方案,即使网上已经有人给出,出于谨慎还是先不采纳)

国产主流机型应用角标的适配(OPPO、vivo、华为、小米)

在开始之前,先声明一下。第一,不是所有的国产手机都能找到支持角标显示的方案(即使理论上可以,可能人家只对 QQ 微信等一些国民级的应用开放设置应用角标的白名单)。第二,本文中涉及到的方案都是经过实际测试且奏效的了(因为测试手机有限,所以不敢说针对这四个品牌的手机机型百分百支持,但支持大部分的机型应该是没问题的)。而且,有些品牌的手机适配方案很容易找到,有些品牌的适配方案则很难找到,这部分我会放到后面的章节来说。下面直接上适配方案:

   华为:

先在AndroidManifest文件里配置好下面的权限:

?

设置角标的方法如下:

?

   OPPO:

?

   vivo:

?

   小米:

小米的设置应用角标方式比较有个性,跟其他厂商的不太一样,是跟Notification绑定在一起的。而且小米系统还有个比较特殊的地方,那就是即使你设置了角标的显示,但只要用户一点进去,应用的角标就会自动消失掉,即使应用内还存在新的未读消息。除非有新的通知或消息到达。

?

2. 在网上找不到现成的解决方案的情况下,该如何去寻找     问题的突破口?

在上面的适配方案中,最容易找到而且奏效的就是华为和小米的适配方案。而 OPPO 的适配方案,即使找到了,在现有的测试机型上却不奏效;vivo 的是适配方案则是最难找的。既然在网上找不到,而 QQ 和微信貌似又是适配得最好的,这就说明,QQ 和微信的源码里肯定有现成的解决方案。那么,不如尝试一下反编译,看看能不能从这两个超级 APP 中找到一些灵感?

在对 QQ 的 apk 进行反编译后,在某各类下果然找到了设置应用角标的实现类:

?

从上图可以看出,QQ 对于各种厂商的适配算是比较完善的了。除了小米、华为、OPPO、vivo,还适配了联想、三星、索尼等。

不同机型的适配方法也都有具体的实现:(下面是手 Q 对于 OPPO 和 vivo 的适配)

?

但是,我们也不能直接拷贝过来就使用。因为说不定有些方法只针对 QQ 才生效呢是吧?

在对微信的 apk 进行反编译后,也能找到关于应用角标适配的代码:

?

总之,对比了一下 QQ 和微信的源码,在某些机型的适配方式上,可能两边会有些出入。实现方式可能也不太一样。但不得不说,不亏是大厂的 APP,看了源码后,实现是学习了很多,特使是一些细节上的处理。

上面总结出的适配方案,其实就是在参考了网上各种资料以及 QQ 和微信的源码之后总结出来的可行的适配方案。如果还不满足大家的需求,大家可以去找一下 QQ 和微信的源码来进行研读,并总结出一套属于自己的适配方案。

3. 一种扩展性比较高的简洁的封装思路

看完了 QQ 和微信的源码后,我发现两边都有一个共同点,那就是某个实现类里塞了很多适配的方法。估计也是可能涉及到不同的人在不同时期维护的历史原因。但一个类里面的代码太多了,可能会对查阅以及后续维护造成一些不便。

这里,我参考了 Android 源码里面NotificationManagerCompat这个类的实现方式。Android 源码中本身就涉及到很多关于不同版本的适配的场景。某个方法,在不同的版本下,可能实现方式不太一样。于是,怎么在不断往某个类增加不同的实现方式的情况下,保持代码的美观以及扩展性易读性变成了一个问题。NotificationManagerCompat这个类的实现就十分简洁美观。下面是一部分源码截图,有兴趣的可以直接去看一下完整的源码。

?

下面就是模仿后的实现:

public class BadgeNumberManager {
   private Context mContext;
   private BadgeNumberManager(Context context) {
       mContext = context;
   }
   public static BadgeNumberManager from(Context context) {
       return new BadgeNumberManager(context);
   }
   private static final BadgeNumberManager.Impl IMPL;

   /**
    * 设置应用在桌面上显示的角标数字
    * @param number 显示的数字
    */

   public void setBadgeNumber(int number) {
       IMPL.setBadgeNumber(mContext, number);
   }
   interface Impl {
       void setBadgeNumber(Context context, int number);
   }
   static class ImplHuaWei implements Impl {
       @Override
       public void setBadgeNumber(Context context, int number) {
           BadgeNumberManagerHuaWei.setBadgeNumber(context, number);
       }
   }
   static class ImplVIVO implements Impl {
       @Override
       public void setBadgeNumber(Context context, int number) {
           BadgeNumberManagerVIVO.setBadgeNumber(context, number);
       }
   }
   static class ImplBase implements Impl {
       @Override
       public void setBadgeNumber(Context context, int number) {
           //do nothing
       }
   }
   static {
       String manufacturer = Build.MANUFACTURER;
       if (manufacturer.equalsIgnoreCase("Huawei")) {
           IMPL = new ImplHuaWei();
       } else if (manufacturer.equalsIgnoreCase("vivo")) {
           IMPL = new ImplVIVO();
       } else if (manufacturer.equalsIgnoreCase("XXX")) {
           //其他品牌机型的实现类
           IMPL = new ImplXXX();
           ......
       } else {
           IMPL = new ImplBase();
       }
   }
}

使用的时候,只需要调用BadgeNumberManager.from(context).setBadgeNumber(num)就行了。BadgeNumberManagerHuaWei、BadgeNumberManagerVIVO等都是针对某个手机品牌的具体实现类。

当然,这只是一种实现的思路而已。具体去实现的时候,请根据自己项目的实际情况,怎样实现扩展性可读性较高就选哪种。

  4. 后记

如果有关于别的机型的适配方案,欢迎在评论下留言(最好是自己亲自测试过并且有效的)。如果文章中有出现错误的地方,欢迎指正。如果对于文章中的某些部分有不同的理解和想法,或者有更好的想法, 也欢迎留言讨论。

?

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 实现不同Launcher 桌面角标的坑(Badge)

项目源码 Android桌面角标的适配确实是非常坑爹的需求。原生系统根本就没有这个功能,国内很多厂家效仿ios都自己定义了该功能。Android程序员就很苦逼,要适配很多机型。建议万不得已情况下还是不...
  • lixiangers
  • lixiangers
  • 2016年04月13日 17:54
  • 8095

Android角标的实现 ,各品牌手机

完整项目 推送,角标,等等功能的下载地址:http://download.csdn.net/detail/vip573117/9869527...
  • vip573117
  • vip573117
  • 2017年06月17日 11:19
  • 1986

android 桌面 未读角标

转载自:http://www.eoeandroid.com/thread-542394-1-1.html 核心:重新生成快捷方式 在小米 三星  索尼 手机 :图标上显示数字(未读消息数)...
  • wscem
  • wscem
  • 2015年05月13日 10:40
  • 6025

Android 为应用添加角标(Badge)

角标是什么意思呢? 看下图即可明了: 可以看到图中的乐购这个app右上角的红色的圆圈,里面有10这个数字的,就是一种角标。 角标,英语是badge,也就是“徽章,像章,奖章;...
  • shikanong
  • shikanong
  • 2017年03月08日 20:53
  • 921

android桌面快捷方式添加数字角标的踩坑之路

提供2个亲测有效的开源项目地址 1.https://github.com/xuyisheng/ShortcutHelper 2.https://github.com/leolin310148/Sh...
  • qq_29678299
  • qq_29678299
  • 2016年06月25日 18:23
  • 4822

Android为应用添加角标(Badge)

1.需求简介 角标是什么意思呢? 看下图即可明了: 可以看到图中的乐购这个app右上角的红色的圆圈,里面有10这个数字的,就是一种角标。 角标,英语是badge,也就是“徽章,像章,奖章; ...
  • gundumw100
  • gundumw100
  • 2017年04月10日 19:14
  • 2537

IOS推送功能的实现(badgeNumber问题)

转自:http://blog.csdn.net/worldmatrix/article/details/7634596 IOS的推送实现由这样几步来完成: 创建Push SSL Certific...
  • niejiafa_131
  • niejiafa_131
  • 2015年03月11日 10:30
  • 5407

Android 为应用桌面 Logo 添加数字提醒

很早之前,项目中提到要在手机桌面上显示应用的消息数量角标,当时找了很多,最终效果都不理想。这两天又提到这个问题,今天在 GitHub 上找到了一个开源库 ShortcutBadger ,代码拉下来测试...
  • lv_fq
  • lv_fq
  • 2017年05月09日 23:43
  • 754

android 小米 vivo版本 webview 页面 渲染问题

项目中遇到webview页面的本地化开发时,告诉我不是一个人。在小米四和vivo手机上,每次滑动会时而不时的出现自定义的顶部头变成背景色的问题。想想挺不可思议的,你一个外来的webview,view一...
  • cyuyanshujujiegou
  • cyuyanshujujiegou
  • 2017年07月13日 08:48
  • 2233

vivo手机定位局限性,如何利用第三方库只获取定位信息

众所周知,定位有多种方式,GPS,Network,Wifi,基站定位。其实最好的用户体验就是把这四种定位方式融合,除非手机没有卡(当然也不开wifi&&gps),不然总是能找到一个相对的位置给你。 然...
  • m0_38082472
  • m0_38082472
  • 2017年06月23日 13:26
  • 730
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关 Android 应用桌面角标 (BadgeNumber) 实现的探讨
举报原因:
原因补充:

(最多只允许输入30个字)