Android开发之为应用添加角标

  • Android角标起源 

角标原本是苹果的iOS中的东西,Android原生并不支持角标,因为Google的意思是让大家用Notification(提示栏)即可。不过无妨,厉害的Android第三方厂商可以通过在自定义的Launcher(启动器)中操作来实现添加角标。

Android开发之为应用添加角标_第1张图片

目前可通过测试的有:小米华为三星索尼 、vivo、google  ~~~

现在就为大家介绍部分机型添加角标的代码。

1、华为手机上显示角标:(已通过)

 
    

     添加如下代码:


String launcherClassName = "com.redfinger.huaweichangebadge.MainActivity";//启动的Activity完整名称
Bundle localBundle = new Bundle();//需要存储的数据
localBundle.putString("package",context.getPackageName());//包名
localBundle.putString("class",launcherClassName);
localBundle.putInt("badgenumber",99);//未读信息条数
getContentResolver().call(
    Uri.parse("content://com.huawei.android.launcher.settings/badge/"),
    "change badge",null,localBundle);

2、小米手机上显示角标:(已通过)

private void setXiaoMiBadge(Context context,int number){
        try{
            Class miuiNotificationClass = Class.forName("android.app.MiuiNotification");
            Object miuiNotification = miuiNotificationClass.newInstance();
            Field field = miuiNotification.getClass().getDeclaredField("messageCount");
            field.setAccessible(true);
            field.set(miuiNotification,String.valueOf(number==0?"":number));
        }catch (Exception e){
            e.printStackTrace();
            // miui6之前
            Intent localIntent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");
            localIntent.putExtra("android.intent.extra.update_application_component_name",context.getPackageName()+"/."+"MainActivity");
            localIntent.putExtra("android.intent.extra.update_application_message_text",String.valueOf(number==0?"":number));
            context.sendBroadcast(localIntent);
        }
    }

3、三星手机上显示角标:(已通过)

String launcherClassName = "com.redfinger.huaweichangebadge.MainActivity";
Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
intent.putExtra("badge_count",99);
intent.putExtra("badge_count_package_name",getPackageName());
intent.putExtra("badge_count_class_name",launcherClassName);
sendBroadcast(intent);

4、索尼手机上显示角标:(找不到相关机型,未测试)

private final String lancherActivityClassName =MainActivity.class.getName();
    
    private void sendToSony(Context context,String number) {
        boolean isShow = true;
        if ("0".equals(number)) {
            isShow = false;
        }
        Intent localIntent = new Intent();
        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", isShow);//是否显示
        localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME",lancherActivityClassName );//启动页
        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", number);//数字
        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());//包名
        context.sendBroadcast(localIntent);
    }

5、vivo手机上显示角标:

public static void vivoShortCut(Context context, String num) {
    Log.e(TAG, "vivoShortCut....");
    Intent localIntent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
    localIntent.putExtra("packageName", context.getPackageName());
    String launchClassName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent().getClassName();
    localIntent.putExtra("className", launchClassName);
    if (TextUtils.isEmpty(num)) {
        num = "";
    } else {
        int numInt = Integer.valueOf(num);
        if (numInt > 0) {
            if (numInt > 99) {
                num = "99";
            }
        } else {
            num = "0";
        }
    }
    localIntent.putExtra("notificationNum", Integer.parseInt(num));
    context.sendBroadcast(localIntent);
}

6、Google​​​​​​​手机上显示角标:

      Android8.0开始支持了,但没有那么理想的效果,只能在图标上显示一个; 
      长按这个点,能弹出一个小pop告诉你有多少消息。

private void setGoogleIconBadgeNum(int count) throws Exception {
        final Context context = App.getInstance().getBaseContext();
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
            throw new Exception(ERROR_LAUNCHER_NOT_SUPPORT_ + "Google");
        }
        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", CappUtils.getLaunchIntentForPackage()); // com.test. badge.MainActivity is your apk main activity

        context.sendBroadcast(intent);
    }

7、总结:

 Android的角标添加和移除毕竟是基于各大手机厂商的Launcher的定制,因此不是正统的Android技巧,随着厂商的Launcher的改变,也许你的代码未来就不一定有用了,因此需要不断修改,“推陈出新”。 不过正所谓“生命在于折腾”,而这也是我们喜欢Android系统的原因。这个萌萌的机器人可以经得起我们随意折腾,在嵌入式领域的应用前途也是很不错的。 
 

你可能感兴趣的:(Android开发)