Android最初原生是没有角标的,各大手机厂商推出了角标,适配也是相对麻烦,需要去适配各家,这里做了整理及使用方法

先把工具类贴出来

import android.app.Notification;import android.app.NotificationChannel;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.AsyncQueryHandler;import android.content.ComponentName;import android.content.ContentResolver;import android.content.ContentValues;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.support.v4.app.NotificationCompat;import android.text.TextUtils;import android.util.Log;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import cn.com.goldwind.eis.R;import cn.com.goldwind.eis.ui.activity.MainActivity;/** * 应用角标工具类 */public class AppShortCutUtil {    private static int notificationId = 0;    public static boolean setCount(final int count, final Context context) {        if (count >= 0 && context != null) {            Log.d("BRAND", Build.BRAND);            switch (Build.BRAND.toLowerCase()) {                case "xiaomi":                    new Handler().postDelayed(new Runnable() {                        @Override                        public void run() {                            setNotificationBadge(count, context);                        }                    }, 3000);                    return true;                case "huawei":                    return setHuaweiBadge(count, context);                case "honor":                    return setHonorBadge(count, context);                case "samsung":                    return setSamsungBadge(count, context);                case "oppo":                    return setOPPOBadge(count, context) || setOPPOBadge2(count, context);                case "vivo":                    return setVivoBadge(count, context);                case "lenovo":                    return setZukBadge(count, context);                case "htc":                    return setHTCBadge(count, context);                case "sony":                    return setSonyBadge(count, context);                default:                    return setNotificationBadge(count, context);            }        } else {            return false;        }    }    public static boolean setNotificationBadge(int count, Context context) {        NotificationManager notificationManager = (NotificationManager) context.getSystemService                (Context.NOTIFICATION_SERVICE);        if (notificationManager == null) {            return false;        }        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {            // 8.0之后添加角标需要NotificationChannel            NotificationChannel channel = new NotificationChannel("badge", "badge",                    NotificationManager.IMPORTANCE_DEFAULT);            channel.setShowBadge(true);            notificationManager.createNotificationChannel(channel);        }        Intent intent = new Intent(context, MainActivity.class);        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);        Notification notification = new NotificationCompat.Builder(context, "badge")                .setContentTitle(context.getResources().getString(R.string.application_angle))                .setContentText(context.getResources().getString(R.string.you_have) + count + context.getResources().getString(R.string.unread_message))                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap                        .ic_launcher))                .setSmallIcon(R.mipmap.ic_launcher)                .setAutoCancel(true)                .setContentIntent(pendingIntent)                .setChannelId("badge")                .setNumber(count)                .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL).build();        // 小米        if (Build.BRAND.equalsIgnoreCase("xiaomi")) {            setXiaomiBadge(count, notification);        }        notificationManager.notify(notificationId++, notification);        return true;    }    private static void setXiaomiBadge(int count, Notification notification) {        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();        }    }    private static boolean setHonorBadge(int count, Context context) {        try {            String launchClassName = getLauncherClassName(context);            if (TextUtils.isEmpty(launchClassName)) {                return false;            }            Bundle bundle = new Bundle();            bundle.putString("package", context.getPackageName());            bundle.putString("class", launchClassName);            bundle.putInt("badgenumber", count);            context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher" +                    ".settings/badge/"), "change_badge", null, bundle);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    private static boolean setHuaweiBadge(int count, Context context) {        try {            String launchClassName = getLauncherClassName(context);            if (TextUtils.isEmpty(launchClassName)) {                return false;            }            Bundle bundle = new Bundle();            bundle.putString("package", context.getPackageName());            bundle.putString("class", launchClassName);            bundle.putInt("badgenumber", count);            context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher" + ".settings/badge/"), "change_badge", null, bundle);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    private static boolean setSamsungBadge(int count, Context context) {        try {            String launcherClassName = getLauncherClassName(context);            if (TextUtils.isEmpty(launcherClassName)) {                return false;            }            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);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    @Deprecated    private static boolean setOPPOBadge(int count, Context context) {        try {            Bundle extras = new Bundle();            extras.putInt("app_badge_count", count);            context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"),                    "setAppBadgeCount", String.valueOf(count), extras);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    @Deprecated    private static boolean setOPPOBadge2(int count, Context context) {        try {            Intent intent = new Intent("com.oppo.unsettledevent");            intent.putExtra("packageName", context.getPackageName());            intent.putExtra("number", count);            intent.putExtra("upgradeNumber", count);            PackageManager packageManager = context.getPackageManager();            List receivers = packageManager.queryBroadcastReceivers(intent, 0);            if (receivers != null && receivers.size() > 0) {                context.sendBroadcast(intent);            } else {                Bundle extras = new Bundle();                extras.putInt("app_badge_count", count);                context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"),                        "setAppBadgeCount", null, extras);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    @Deprecated    private static boolean setVivoBadge(int count, Context context) {        try {            String launcherClassName = getLauncherClassName(context);            if (TextUtils.isEmpty(launcherClassName)) {                return false;            }            Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");            intent.putExtra("packageName", context.getPackageName());            intent.putExtra("className", launcherClassName);            intent.putExtra("notificationNum", count);            context.sendBroadcast(intent);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    private static boolean setZukBadge(int count, Context context) {        try {            Bundle extra = new Bundle();            ArrayList ids = new ArrayList<>();            // 以列表形式传递快捷方式id,可以添加多个快捷方式id//        ids.add("custom_id_1");//        ids.add("custom_id_2");            extra.putStringArrayList("app_shortcut_custom_id", ids);            extra.putInt("app_badge_count", count);            Uri contentUri = Uri.parse("content://com.android.badge/badge");            Bundle bundle = context.getContentResolver().call(contentUri, "setAppBadgeCount", null,                    extra);            return bundle != null;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    private static boolean setHTCBadge(int count, Context context) {        try {            ComponentName launcherComponentName = getLauncherComponentName(context);            if (launcherComponentName == null) {                return false;            }            Intent intent1 = new Intent("com.htc.launcher.action.SET_NOTIFICATION");            intent1.putExtra("com.htc.launcher.extra.COMPONENT", launcherComponentName                    .flattenToShortString());            intent1.putExtra("com.htc.launcher.extra.COUNT", count);            context.sendBroadcast(intent1);            Intent intent2 = new Intent("com.htc.launcher.action.UPDATE_SHORTCUT");            intent2.putExtra("packagename", launcherComponentName.getPackageName());            intent2.putExtra("count", count);            context.sendBroadcast(intent2);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    private static boolean setSonyBadge(int count, Context context) {        String launcherClassName = getLauncherClassName(context);        if (TextUtils.isEmpty(launcherClassName)) {            return false;        }        try {            //官方给出方法            ContentValues contentValues = new ContentValues();            contentValues.put("badge_count", count);            contentValues.put("package_name", context.getPackageName());            contentValues.put("activity_name", launcherClassName);            SonyAsyncQueryHandler asyncQueryHandler = new SonyAsyncQueryHandler(context                    .getContentResolver());            asyncQueryHandler.startInsert(0, null, Uri.parse("content://com.sonymobile.home" +                    ".resourceprovider/badge"), contentValues);            return true;        } catch (Exception e) {            try {                //网上大部分使用方法                Intent intent = new Intent("com.sonyericsson.home.action.UPDATE_BADGE");                intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", count > 0);                intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME",                        launcherClassName);                intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String                        .valueOf(count));                intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context                        .getPackageName());                context.sendBroadcast(intent);                return true;            } catch (Exception e1) {                e1.printStackTrace();                return false;            }        }    }    private static String getLauncherClassName(Context context) {        ComponentName launchComponent = getLauncherComponentName(context);        if (launchComponent == null) {            return "";        } else {            return launchComponent.getClassName();        }    }    private static ComponentName getLauncherComponentName(Context context) {        Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context                .getPackageName());        if (launchIntent != null) {            return launchIntent.getComponent();        } else {            return null;        }    }    static class SonyAsyncQueryHandler extends AsyncQueryHandler {        SonyAsyncQueryHandler(ContentResolver cr) {            super(cr);        }    }}

这里各个方法不用太在意,都是各大厂商提供的角标设置方法

下面贴出使用方法

例如我这里接入的是极光推送,在对应的广播类中进行显示操作,我这里的逻辑是每次接受到广播角标数量+1,在打开MainActivity的时候进行清零

1.首先,申请权限 AndroidManifest.xml

                                                        

2.JPushMessageReceiver继承类

    @Override    public void onNotifyMessageArrived(Context context, NotificationMessage message) {        Log.e(TAG, "[onNotifyMessageArrived] " + message);        count = count + 1;        AppShortCutUtil.setCount(count, EISApp.appContext);        Log.d("-=-", "===" + count);    }

3.最后MainActivity

    @Override    protected void onResume() {        super.onResume();        if (0 != PushMessageReceiver.count) {            //角标清空            PushMessageReceiver.count = 0;            AppShortCutUtil.setCount(PushMessageReceiver.count, MainActivity.this);        }    }

ok,到这里就大功告成了,现在就可以去发一条推送试试了

更多相关文章

  1. Android(安卓)面试--请描述一下Activity的生命周期?
  2. [Android]调用字符串资源的几种方法
  3. android通过web service调用查询手机归属地代码
  4. Android(安卓)- BroadcastReceiver
  5. Android(安卓)BigNews 曾量更新
  6. Android使用Toast显示消息提示框
  7. 【Android】报错IOException: Read-only file system问题解决方
  8. Recycler的一些笔记
  9. 选项卡的使用方法一(Android学习随笔十二)

随机推荐

  1. mysql开启慢查询(EXPLAIN SQL语句使用介
  2. mysql之explain使用详解(分析索引)
  3. InnoDB 类型MySql恢复表结构与数据
  4. MySQL索引使用说明(单列索引和多列索引)
  5. MySQL的索引详解
  6. 关于Mysql隔离级别、锁与MVCC介绍
  7. 详解mysql权限和索引
  8. linux环境下配置mysql5.6支持IPV6连接的
  9. mysql入门之1小时学会MySQL基础
  10. mybatis+mysql 使用存储过程生成流水号的