美学原理Badge分析&怎么着逼死双鱼座

种种ROM角标分析

锤子

锤子很遗憾,使用的是原生Launcher举办的改动,只有System
App具有得到角标的权力。

Sony Badge

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

LG Badge

三星好基友,三星(Samsung)能用的,LG大概都能够用,连Bug都如出一辙。

酷派 Badge

简单残酷,不支持。小编喜爱,类原生。

Badge分析

所谓Badge,原本是iOS上的二个功用,不过被Android抄的多了,也就成了Android的标配。图就不上了,大家都懂的。

运用icon展现角标实际上是在Launcher中落到实处的,其实无论是角标依旧其余对飞速格局的增加和删除改查,都以急需Launcher支持的,应用在增加和删除改查急迅方式和装置、卸载时,都会时有发生相应的广播,通过这一个广播,Launcher会对飞速格局举办改动。

很庆幸,Android原生ROM的Launcher并不抱有给icon添加角标的效力,因为Android的宏图思想是把持有消息中央都停放在Notification通告栏中,唯有iOS那种布告栏半残废的,才会使用角标。那玩意儿,让恐怖症病人,完全不能自理,天天陷落在摒除小红点的生活中。

很正剧,Android的AOSP代码被国内各大ROM厂商改的无法自理。很多被改动的ROM都足以支撑那种角标的成效,甚至是很多第1方Launcher,也提供了那种效应。其基本原理也是全世界一大抄,都以监听发出的广播来展开火速格局的修改,然则,关键是未曾谷歌(Google)亲爹的支撑,全部的兑现都不合并,我们本身做协调的,没有统一的接口,导致种种碎片化万分沉痛。

前些天原理很清楚了,关键就是要尽恐怕多的找到那个ROM、Launcher的改动icon的播音。

在踏勘该难题时,作者找到了https://github.com/leolin310148/ShortcutBadger
那一个库,很多地方参考了那一个库,可是该库由于很久没有保卫安全了,所以笔者领到了中间收集的有的Badge的措施,并做了一揽子,那里对笔者表示谢谢。

HTC Badge

索尼爱立信即使没落了,但好歹是第②头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);

其原理同样是选择广播,不解释了。

Github

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

方法二

https://github.com/shafty023/SamsungBadger

Samsung Badge

华为EMUI Badge

当前红米的ROM只扶助给停放的App添加角标,摩托罗拉本人并未交到相应的接口。

方法一

透过三星(Samsung)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的包名和类名。之所以,你当然可以在程序里面给别的任意2个App设置任意数量的角标,而且没有其他提醒,是的,很流氓,什么人说不是啊,当然别说是自作者报告您的,你就所你是百度的。例如:

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

将包名和类名用QQ的替换下,然后您就能够随便、为非作歹了。

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);

MIUI6&7 Badge

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

① 、基本介绍

① 、暗中同意的景况

当app 向文告栏发送了一条文告(文告不带进程条并且用户能够去除的),那么桌面app
icon角标就会来得1.此时app呈现的角标数是和公告栏里app发送的布告数对应的,即向文告栏发送了有点公告就会彰显多少角标。

贰 、通告可以定义角标数

譬如 有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);
}

一对好玩的

在知情了一些ROM的变更角标的原理,大家能够做一些妙不可言的东西。前面在说LGSamsung索尼(Sony)的ROM的时候,已经涉及了,广播只须求后人包名和运营Activity名就足以给自由2个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,丧心病狂,逼死自闭症巨蟹座。

请勿滥用,因此滋生的整整难点,不要找小编

请不要提桌面背景!!!

ZUK ZUI Badge

ZUK作为1个那多少个小众的无绳电话机厂商,居然在网上官方给出了详细的开发者文书档案,就那或多或少,很多大厂都该好好打打自身的耳光。

鉴于实在找不到ZUK的测试机,所以那边给出ZUK的开发者文档,有要求的融洽看看啊:

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