Badge分析&如何逼死处女座

Badge分析

所谓Badge,原本是iOS上的一个效,但是被Android抄的大多矣,也就算改成了Android的标配。图就是无达标了,大家都懂的。

下icon显示角标实际上是以Launcher中贯彻之,其实无论是是角标还是其他对快捷方式的增删改查,都是需要Launcher支持的,应用在增删改查快捷方式和安、卸载时,都见面出相应的广播,通过这个广播,Launcher会对快捷方式进行改动。

大庆幸,Android原生ROM的Launcher并无享让icon添加角标的职能,因为Android的设计思想是拿具有信息中心还停放在Notification通知栏中,只有iOS这种通知栏半残废的,才会用角标。这游戏意儿,让强迫症患者,完全不能自理,每日陷落在脱小红点的生活受到。

充分悲剧,Android的AOSP代码被国内各级大ROM厂商改的不能自理。很多为改的ROM都得以支撑这种角标的功用,甚至是成千上万叔在Launcher,也供了这种功能。其基本原理也是中外一万分抄,都是监听发出之广播来展开快捷方式的修改,但是,关键是绝非Google亲爹的支撑,所有的贯彻还无联合,大家好举行要好之,没有统一的接口,导致各种碎片化非常惨重。

本原理非常清晰了,关键就若尽可能多的找到这些ROM、Launcher的改icon的播音。

以检察该问题常常,我找到了https://github.com/leolin310148/ShortcutBadger
这个库房,很多地方参考了此库房,但是该库由于老遥远没保护了,所以自己取了里收集的片Badge的法门,并召开了健全,这里针对作者表示感谢。

各种ROM角标分析

MIUI6&7 Badge

以下内容来自MUI开发者平台:

平等、基本介绍

1、默认的状态

当app 向通知栏发送了同长长的通知
(通知非带来进度长条又用户可以去除的),那么桌面app
icon角标就见面显示1.此时app显示的角标数是同通告栏里app发送的通知数对应之,即向通知栏发送了有点通知就会见显小角标。

2、通知可以定义角标数

比如说 有5封闭无念邮件,通知栏里只是会展示平长条通知,但是想被角标显示5.
可以于作通告时加个标志。

修改MIUI的规律是经反射拿到Notification的民用属性extraNotification,但是这个extraNotification在MIUI系统中重定义了,这个看似就是MIUI系统中的android.app.MiuiNotification这个近乎,这个仿佛中来个村办属性messageCount,我们而改变者messageCount值就可知显示的改动app
icon的角标数了。

次、实现代码

老三方app需要为此反射来调用,参考代码:

/**
 * 设置MIUI的Badge
 *
 * @param context context
 * @param count   count
 */
private static void setBadgeOfMIUI(Context context, int count) {
    Log.d("xys", "Launcher : MIUI");
    NotificationManager mNotificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Notification.Builder builder = new Notification.Builder(context)
            .setContentTitle("title").setContentText("text").setSmallIcon(R.mipmap.ic_launcher);
    Notification notification = builder.build();
    try {
        Field field = notification.getClass().getDeclaredField("extraNotification");
        Object extraNotification = field.get(notification);
        Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);
        method.invoke(extraNotification, count);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mNotificationManager.notify(0, notification);
}

Sony Badge

https://forsberg.ax/en/blog/android-notification-badge-app-icon-sony/

Samsung Badge

方法一

通过三星Launcher自己的广播,来叫采用添加角标:

/**
 * 设置三星的Badge
 *
 * @param context context
 * @param count   count
 */
private static void setBadgeOfSumsung(Context context, int count) {
    // 获取你当前的应用
    String launcherClassName = getLauncherClassName(context);
    if (launcherClassName == null) {
        return;
    }
    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);
}

这个方法不待另权力,只待知道App的包名和类名。用,你当好以先后中给任何任意一个App设置任意数量的角标,而且无其它提示,是的,很流氓,谁说勿是吗,当然别说凡是自己告诉您的,你就是所而是百度的。例如:

intent.putExtra("badge_count_package_name", "com.tencent.mobileqq");
    intent.putExtra("badge_count_class_name", "com.tencent.mobileqq.activity.SplashActivity");

拿包名和好像名用QQ的更迭下,然后您就足以轻易、为所欲为。

方法二

https://github.com/shafty023/SamsungBadger

LG Badge

Samsung好基友,三星球能为此之,LG几乎都可就此,连Bug都一律。

华为EMUI Badge

眼前华为的ROM只支持为放的App添加角标,华为本身没有受来相应的接口。

酷派 Badge

简言之粗暴,不支持。我喜爱,类原生。

ZUK ZUI Badge

ZUK作为一个非常小众的手机厂商,居然在网上官方给出了详细的开发者文档,就当下一点,很多分外厂都该好好打打自己的耳光。

出于实在找不交ZUK的测试机,所以这边为出ZUK的开发者文档,有亟待的亲善看吧:

http://developer.zuk.com/detail/12

HTC Badge

HTC虽然没落了,但好歹是第一单纯Android的寄生兽,好歹也支撑下。

Intent intentNotification = new Intent("com.htc.launcher.action.SET_NOTIFICATION");
ComponentName localComponentName = new ComponentName(context.getPackageName(),
        AppInfoUtil.getLauncherClassName(context));
intentNotification.putExtra("com.htc.launcher.extra.COMPONENT", localComponentName.flattenToShortString());
intentNotification.putExtra("com.htc.launcher.extra.COUNT", count);
context.sendBroadcast(intentNotification);

Intent intentShortcut = new Intent("com.htc.launcher.action.UPDATE_SHORTCUT");
intentShortcut.putExtra("packagename", context.getPackageName());
intentShortcut.putExtra("count", count);
context.sendBroadcast(intentShortcut);

那规律同是采用广播,不解释了。

锤子

锤子很遗憾,使用的凡原生Launcher进行的修改,只有System
App具有取角标的权杖。

Nova Badge

Nova是同样款好赞赏的Launcher,作为第三正值Launcher,它的使用率挺强(当然是当海外)。该Launcher作为业界良心,提供了content
provider供外界调用。与ZUK手机一样,良心大大的好,代码如下:

ContentValues contentValues = new ContentValues();
contentValues.put("tag", context.getPackageName() + "/" +
        AppInfoUtil.getLauncherClassName(context));
contentValues.put("count", count);
context.getContentResolver().insert(Uri.parse("content://com.teslacoilsw.notifier/unread_count"),
        contentValues);

一对诙谐的

当知晓了一部分ROM的转移角标的原理,我们可举行有好玩的物。前面在游说LG三星Sony的ROM的时节,已经关系了,广播就需要后人包名和开行Activity名就好为自由一个icon添加角标,因此。。。直接扣代码吧:

/**
 * Bug利用测试,请勿滥用
 *
 * @param view view
 */
public void madMode(View view) {
    madMode(99);
}

/**
 * 清除Bug角标
 *
 * @param view view
 */
public void cleanMadMode(View view) {
    madMode(0);
}

/**
 * 获取所有App的包名和启动类名
 *
 * @param count count
 */
private void madMode(int count) {
    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    List<ResolveInfo> list = getPackageManager().queryIntentActivities(
            intent, PackageManager.GET_ACTIVITIES);
    for (int i = 0; i < list.size(); i++) {
        ActivityInfo activityInfo = list.get(i).activityInfo;
        String activityName = activityInfo.name;
        String packageName = activityInfo.applicationInfo.packageName;
        BadgeUtil.setBadgeOfMadMode(getApplicationContext(), count, packageName, activityName);
    }
}

非常简单的代码,就是经过PM找来具有启动Intent的Activity,再取出其包名,通过安装来上加角标。效果使图:

device-2015-12-07-141255.png

device-2015-12-07-141314.png

device-2015-12-07-141337.png

OK,丧心病狂,逼死强迫症处女座。

呼吁不滥用,由此引起的万事问题,不要找我

求不要提桌面背景!!!

Github

忘记发地址了
https://github.com/xuyisheng/ShortcutHelper