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

先把工具类贴出来

package cn.com.goldwind.eis.utils;import android.app.Notification;
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.net.Uri;
import android.os.Build;
import android.os.Bundle;import androidx.core.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;/*** 应用角标工具类*/
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);Log.v("-=-", "角标数量" + count);switch (Build.BRAND.toLowerCase()) {case "xiaomi":
//                    new Handler().postDelayed(new Runnable() {
//                        @Override
//                        public void run() {
//                            setNotificationBadge(count, context);
//                        }
//                    }, 3000);setXiaomiBadge(count);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);}return true;} 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);
//        }
//        notificationManager.notify(notificationId++, notification);
//        return true;
//    }private static void setXiaomiBadge(int count ) {try {Notification notification = new Notification();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;}}@Deprecatedprivate 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;}}@Deprecatedprivate 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<ResolveInfo> 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;}}@Deprecatedprivate 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<String> 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

    <!-- 华为 --><uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/><uses-permission android:name="android.permission.INTERNET"/><!-- 三星 --><!--<uses-permission android:name="com.sec.android.provider.badge.permission.READ"/>--><!--<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/>--><!-- OPPO --><uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS"/><uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS"/><!-- 联想ZUK --><uses-permission android:name="android.permission.READ_APP_BADGE"/><!-- HTC --><uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS"/><uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT"/>

2.JPushMessageReceiver继承类

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

3.最后MainActivity

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

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

Android应用推送角标设置方法相关推荐

  1. android 角标数字管理,Android应用推送角标设置方法

    原标题:Android应用推送角标设置方法 Android最初原生是没有角标的,各大手机厂商推出了角标,适配也是相对麻烦,需要去适配各家,这里做了整理及使用方法 先把工具类贴出来 importandr ...

  2. android 小米推送角标,MIUI67桌面角标开源代码简介

    MIUI6&7桌面角标开源代码简介 MIUI6&7上重新设计了桌面app图标的角标显示,基本规则如下: 一.基本介绍 1.默认的情况 当app 向通知栏发送了一条通知 (通知不带进度条 ...

  3. php 友盟推送角标,桌面角标设置以及消息推送服务

    更新记录 0.01(2020-05-09) 1.添加角标设置 2.添加清除角标 3.添加品牌获取 4.添加通知栏推送 5.添加点击通知栏进入APP 平台兼容性 Android iOS × 原生插件通用 ...

  4. 极光推送 角标清0 未读消息不清空

    不要调用 [UIApplication sharedApplication].applicationIconBadgeNumber = 0; 角标和通知栏未读推送都会清空 使用下面的方法... - ( ...

  5. php 友盟推送角标,android集成友盟推送实现离线在线推送及桌面图标角标设置

    本人亲测有效,有问题欢迎评论,互相学习 1.集成友盟推送-根据友盟文档集成即可实现在线推送 2.集成后想要实现点击跳转到指定页面,那么就要根据后台返回的数据进行跳转 (1)在线推送-在applicat ...

  6. android小米推送,Android手机端小米推送Demo解析和实现方法

    最近这几个月都是在准备找工作和找工作中,付出了很多,总算是有点收获,所以都没有怎么整理笔记.到了最近才有空把自己的笔记整理一下发上来,分享一下我的学习经验. 推送 由于最近项目要用到Android的消 ...

  7. 2022-01-26 Android应用角标适配方法,源码在三星和华为上测试通过。

    一.应用的角标如下面的红点,提示用户有新的信息更新.角标,英语是badge,也就是"徽章,像章,奖章: 象征,标记"的意思.一般来说,应用的角标是用来标记有多少条提醒(Notifi ...

  8. android 消息推送方法,一种基于Android系统的消息推送方法技术方案

    [技术实现步骤摘要] 本专利技术涉及一种基于Android系统的消息推送方法,属于计算机 技术介绍 推送功能在手机应用开发中越来越重要,已经成为手机开发的必选项.消息推送,就是在互联网上通过定期传送用 ...

  9. Android实现应用数字角标

    最近遇到一个需求,需要将APP内某几个tab的未读消息数显示到桌面的应用角标上,于是查阅了一番资料,并咨询了几家应用开放平台,踩了几个小坑,最终勉强实现了自己的需求.由于国内主流手机为华为.小米.vi ...

最新文章

  1. Android Studio开发环境配置(win7)
  2. 用几条shell命令快速去重10G数据
  3. ubuntu20.04运行愤怒的小鸟
  4. 计算机专业哪家强,计算机专业哪家强?这4所大学水平一流,网友:都是“大佬”级别...
  5. php.ini-development和php.ini-production的区别
  6. 优化技巧一、UITableView加载图片
  7. java 去掉大量if else_Java中大量if...else语句的消除替代方案
  8. jbpm知识点——state
  9. 字符串与数组之间的相互转化
  10. 查看数据库开了inodb_Mysql中查看表的类型InnoDB
  11. Java数组3(2015-8-27)
  12. 关于点击button按钮自动刷新页面导致ajax来不及执行的原因
  13. yaml格式文件介绍
  14. 计算机cpu温度显示原理,电脑cpu温度怎么看
  15. 如何把TS视频文件转换为MP4格式?
  16. bootstrapValidator.js文件里的提示语:设置为中文
  17. 赛天网吧无盘服务器,200台MZD无盘网吧解决方案.docx
  18. CCS 修改字体大小
  19. 2022最新网络安全零基础学习路线
  20. Chapter7 机器人导航仿真(Ⅰ)----导航实现

热门文章

  1. 斐波纳奇回调线在杠杆叠加原理中的应用
  2. 修改CS、IP的指令与jmp指令
  3. 移动架构学习笔记八:化主动为被动的观察者模式
  4. eclipse 护眼色设置
  5. 给招聘HR的3个建议,工作招聘必备
  6. 动画总结 Core Animation 贝赛尔曲线 显式动画 隐式动画
  7. http-MIME 类型
  8. git revert讲解
  9. Predicted boxes or scores contain Inf/NaN. Training has diverged
  10. python降维方法_使用Python进行数据降维|线性降维