1、需求说明
最近公司要在安卓应用中学习ios---为应用添加角标,所以就查阅了大量的资料。
2、比较好用的github项目
安卓本身是没有角标这个api的,不过为了迎合市场,模仿IOS,各大手机厂商定制了自己的Launcher(启动器)中操作来实现添加角标。
在github上找到一个比较好用的项目 https://github.com/leolin310148/ShortcutBadger
蛮多人支持的哦!!
3、原理解析
这个项目整合了目前主流的Android手机的角标展示。做了兼容处理。而且代码结构非常简单清晰。
华为手机的角标原理是:发送广播
Intent intent =new Intent(INTENT_ACTION);
intent.putExtra(INTENT_EXTRA_BADGE_COUNT, badgeCount);
intent.putExtra(INTENT_EXTRA_PACKAGENAME, componentName.getPackageName());
intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName());
intent.putExtra("badge_vip_count",0);
if (BroadcastHelper.canResolveBroadcast(context, intent)) {
context.sendBroadcast(intent);
}else {
throw new ShortcutBadgeException("unable to resolve intent: " + intent.toString());
}
小米手机比较不好兼容,作者也弃用了小米的兼容工具类,不过有些手机还是可以的(具体的可以自己看作者写的哈),这里我附上小米官网给的角标处理代码:
https://dev.mi.com/doc/p=3904/index.html
https://dev.mi.com/console/doc/detail?pId=939
作者也都有写
3.1、比较尴尬的小米手机兼容问题
我用的red mi note 4x ,这部手机比较不好兼容,反正这个项目不满足我们的需求。
我分析了项目的源码,还有note 4x的效果,发现这部手机必须要通过notification 来修改角标数量。
if (resolveInfo ==null) {
Intent intent =new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
resolveInfo = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
}
if (resolveInfo !=null) {
NotificationManager mNotificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder =new Notification.Builder(context)
.setContentTitle("")
.setContentText("")
.setSmallIcon(resolveInfo.getIconResource());
Notification notification = builder.build();
mNotificationManager.cancel(notificationId);
notificationId++;
try {
Field field = notification.getClass().getDeclaredField("extraNotification");
Object extraNotification = field.get(notification);
Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount",int.class);
method.invoke(extraNotification, badgeCount);
mNotificationManager.notify(notificationId, notification);
}catch (Exception e) {
throw new ShortcutBadgeException("not able to set badge", e);
}
}
我们在处理角标的同事还有通知,这样的话每次出现通知的同时,还一个空白的通知,于是我把这个方法放在通知里面,做了兼容处理。把这里注释了。
编译,运行,完美兼容。哈哈哈
当然也有一些其他手机还没有做到全面测试(测试机确实不够),只能遇到问题解决问题了
5、Android 8.0 通知栏角标适配
我在做华为手机(android 8.0)通知栏测试的时候,通知栏始终不出来。在这里要感谢一个博客:https://blog.csdn.net/guolin_blog/article/details/79854070,这个博客拨云见日,让我做好了android 8.0的通知的适配。
这个博客讲的非常详细,可以自己去看看。