最近遇到一个需求,需要将APP内某几个tab的未读消息数显示到桌面的应用角标上,于是查阅了一番资料,并咨询了几家应用开放平台,踩了几个小坑,最终勉强实现了自己的需求。由于国内主流手机为华为、小米、vivo、OPPO,故目前只准备实现这四款机型的角标功能,不过OPPO在咨询客服的时候被告知不开放数字角标的功能,因此目前就实现了华为、小米与vivo的需求。

一、华为机型

华为提供有实现方式,需要注意的地方只有两点,一个是在manifest中添加权限,
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>另一个是填写的地方是项目的launcherActivity,具体代码如下:/** * 华为手机 创建角标 * @param context         * @param num  角标数 */public void setHuaWeiBadgeNum(Context context,int num) {try {Bundle bunlde = new Bundle();bunlde.putString("package", context.getPackageName());bunlde.putString("class", "com.xxxx.xxxx.LauncherActivity");//此处为启动页路径bunlde.putInt("badgenumber", num);context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bunlde);} catch (Exception e) {e.printStackTrace();}}

二、小米机型

小米厂商的角标设置别出心裁,厂商通过通知消息来创建角标信息,所以,想要让小米手机显示应用角标,需要搭配通知一起使用。这不是什么问题,问题是当我按照文档中实现后,发现应用只有第一次会显示角标,之后都不会再显示了。其实这时候小米是创建了角标,不过由于APP在前台,所以创建后又消失了,导致我以为没有创建成功。发现这个问题后,我的实现方式就改为,当APP退到后台的时候 再去创建通知,这样角标就能正常显示了。
注意点:
1、 提前把手机的通知过滤给关掉,不然只会有通知不会有角标显示。
2、 如果消息通知使用同一个id,则需要每次发送通知前将上一条消息清除掉,否则不会 显示角标。

  /** * 小米手机创建通知信息并创建角标* @param context* @param num      */
public void setXiaoMiBadgeNum(Context context,int num) {try{                NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);String title = "消息提示";String desc = "您有" + num + "条未读消息";  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){String channelId = "default";    String channelName = "默认通知";    NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH);    channel.setShowBadge(true);    notificationManager.createNotificationChannel(channel);}Notification notification = new NotificationCompat.Builder(context, "default") .setContentTitle(title).setContentText(desc)        .setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.icon_logo).setAutoCancel(true).setChannelId("default").setNumber(num).setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL).build();//取消掉上一条通知消息notificationManager.cancel(1);Field field = notification.getClass().getDeclaredField("extraNotification");Object extraNotification = field.get(notification);Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);method.invoke(extraNotification, num);notificationManager.notify(1, notification);}catch (Exception e){e.printStackTrace();}
}BaseApplication.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Override   public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}   @Override    public void onActivityStarted(Activity activity) { }   @Override   public void onActivityResumed(Activity activity) { }   @Override    public void onActivityPaused(Activity activity) {   }    @Override   public void onActivityStopped(Activity activity) { //此处判断是小米机型并且是在后台则调用if (Build.MANUFACTURER.equalsIgnoreCase("xiaomi") && !AppUtils.isForeground()) {setXiaoMiBadgeNum(activity);        }    }@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}
});//当前应用是否处于前台
public static boolean isForeground() {android.app.ActivityManager am = (ActivityManager) BaseApplication.getSystemService(Context.ACTIVITY_SERVICE);ComponentName cn = am.getRunningTasks(1).get(0).topActivity;String currentPackageName = cn.getPackageName();if (!TextUtils.isEmpty(currentPackageName) && currentPackageName.equals(BaseApplication.getPackageName())) {return true;}return false;
}

三、vivo机型

vivo之前是不开放角标的,现在官方文档里开放了角标并且提供了对应的方法,与华为用法差不多,不过存在一定的限制条件。一、不能使用vivo自身的推送渠道,二、手机需要8.0及以上的Android版本。
官方文档中提示8.0以上版本需要添加flag
intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
不过在intent的源码中,FLAG_RECEIVER_INCLUDE_BACKGROUND是被@hide修饰的,外部无法调用,所以这里直接将它对应的int值填入
vivo也需要在manifest中添加权限,不要忘记了:

<uses-permission android:name="com.vivo.notification.permission.BADGE_ICON" />
/*** vivo手机创建角标* 只有非vivo推送渠道并且8.0以上手机才可以使用下列方式* @param context*/@SuppressLint("WrongConstant")
public void setVivoBadgeNum(Context context,int num) {Intent intent = new Intent();intent.setAction("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");intent.addFlags(0x01000000); //FLAG_RECEIVER_INCLUDE_BACKGROUND对应的int值intent.putExtra("packageName", context.getPackageName());intent.putExtra("className", "com.xxxx.xxxx.LauncherActivity");intent.putExtra("notificationNum", num);context.sendBroadcast(intent);
}

Android实现应用数字角标相关推荐

  1. Android设置应用数字角标

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

  2. android 为桌面图标添加数字角标

    android 为桌面图标添加数字角标 我的github项目 BadgeForAppIcon 看完麻烦 star 一下 在某些app的设计中,产品经理总会想当然的提出为桌面图标添加数字角标的需求.作为 ...

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

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

  4. Mui的APPLOGO数字角标小米问题

    之前写了篇博客,生成jar包并添加进项目离线打包安卓APP,实现APP上LOGO的数字角标,但是最近有用户寄过来一台小米max3,因为APP启动后执行到显示数字角标的时候会崩. 通过Android S ...

  5. Android 实现应用桌面角标

    1.小米手机 官方文档:文档中心 /*** 小米手机创建通知信息并创建角标** @param context* @param num*/public static void setXiaoMiBadg ...

  6. Android新荣耀手机角标只增不减

    Android新荣耀手机角标只增不减 荣耀不再是华为 新荣耀手机包名变更 兼容新荣耀角标更新 咨询华为客服 咨询荣耀客服 附件 荣耀不再是华为 2020年11月17日,深圳市智信新信息技术有限公司完成 ...

  7. Andoid 桌面icon添加数字角标

    产品经理拿着iPhone对我说,"这加上角标",转身就走了. 在Android系统中,是不支持BadgeNumber的,也就是原生Android系统是没有类似于ios 桌面icon ...

  8. uni-app消息推送华为不显示数字角标???

    操作过程: 1. 将设备的角标显示方式改为数字角标 2. 在uni-app代码中设置角标: plus.runtime.setBadgeNumber(1) //添加角标 发现App的角标并没有显示数字. ...

  9. HTML页面仿iphone数字角标

    做仿iphone样式的数字角标,用简单的css来实现 <html> <head> <title>角标数字</title> <style type= ...

最新文章

  1. stat用法:获取文件对应权限的数字
  2. OpenGL天空游戏
  3. 右键快捷VsCode
  4. java和opencv配置_Java——OpenCVWindows配置和项目中jar包的简单配置
  5. 【转】[SharePoint 开发详解] 一个Feature中使用SPGridView的几个Tips
  6. php ajax loading图片居中显示,php-通过ajax框架加载漂亮照片
  7. C++的多态原理和实现
  8. Spring配置补充
  9. 创建数据账号只有个别表的权限_创建MySQL用户 赋予某指定库表的权限
  10. JVM中也有并发GC,CMS机制
  11. 转 基于.NET平台的分层架构实战
  12. 2020 cr节目源_2020年四款最新直播软件汇总,频道多,画质流畅节目源超级稳定!...
  13. java jdk 1.5下载_jdk 1.5 64位
  14. 【MapGIS精品教程】005:MapGIS中间件的配置与使用
  15. 莫烦python强化学习笔记——Q learning
  16. 超好玩的msn自制动画头像
  17. HttpClient4模拟表单提交
  18. WPS 关闭热点推送通知
  19. html img 拉伸,图片因img标签拉伸的处理办法
  20. 王者苹果服务器维护几点能玩,《王者荣耀》ios版更新维护到几点 10月17日ios版更新时间介绍...

热门文章

  1. 移动网页支付(微信H5支付和支付宝网页支付)
  2. 天津医科大学公共卫生考研经验
  3. LintCode 1173.反转字符串
  4. deficit记忆_总算懂得单词every分析记忆方法
  5. ios 默认字体加粗
  6. 用pdfminer把PDF文件转化为文本文件
  7. 这一周CSDN人都看了些什么?(5.14-5.20)
  8. python hypothesis testing
  9. 安利:那些让你欲罢不能的宝贝网站
  10. 开游戏服务器要选择什么样的?