原标题:Android应用推送角标设置方法

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

先把工具类贴出来

importandroid.app.Notification;

importandroid.app.NotificationChannel;

importandroid.app.NotificationManager;

importandroid.app.PendingIntent;

importandroid.content.AsyncQueryHandler;

importandroid.content.ComponentName;

importandroid.content.ContentResolver;

importandroid.content.ContentValues;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.content.pm.PackageManager;

importandroid.content.pm.ResolveInfo;

importandroid.graphics.BitmapFactory;

importandroid.net.Uri;

importandroid.os.Build;

importandroid.os.Bundle;

importandroid.os.Handler;

importandroid.support.v4.app.NotificationCompat;

importandroid.text.TextUtils;

importandroid.util.Log;

importjava.lang.reflect.Field;

importjava.lang.reflect.Method;

importjava.util.ArrayList;

importjava.util.List;

importcn.com.goldwind.eis.R;

importcn.com.goldwind.eis.ui.activity.MainActivity;

/**

* 应用角标工具类

*/

publicclassAppShortCutUtil{

privatestaticintnotificationId = 0;

publicstaticbooleansetCount(finalintcount, finalContext context){

if(count >= 0&& context != null) {

Log.d( "BRAND", Build.BRAND);

switch(Build.BRAND.toLowerCase) {

case"xiaomi":

newHandler.postDelayed( newRunnable {

@Override

publicvoidrun{

setNotificationBadge(count, context);

}

}, 3000

returntrue;

case"huawei":

returnsetHuaweiBadge(count, context);

case"honor":

returnsetHonorBadge(count, context);

case"samsung":

returnsetSamsungBadge(count, context);

case"oppo":

returnsetOPPOBadge(count, context) || setOPPOBadge2(count, context);

case"vivo":

returnsetVivoBadge(count, context);

case"lenovo":

returnsetZukBadge(count, context);

case"htc":

returnsetHTCBadge(count, context);

case"sony":

returnsetSonyBadge(count, context);

default:

returnsetNotificationBadge(count, context);

}

} else{

returnfalse;

}

}

publicstaticbooleansetNotificationBadge(intcount, Context context){

NotificationManager notificationManager = (NotificationManager) context.getSystemService

(Context.NOTIFICATION_SERVICE);

if(notificationManager == null) {

returnfalse;

}

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

// 8.0之后添加角标需要NotificationChannel

NotificationChannel channel = newNotificationChannel( "badge", "badge",

NotificationManager.IMPORTANCE_DEFAULT);

channel.setShowBadge( true);

notificationManager.createNotificationChannel(channel);

}

Intent intent = newIntent(context, MainActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

Notification notification = newNotificationCompat.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);

returntrue;

}

privatestaticvoidsetXiaomiBadge(intcount, 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;

}

}

privatestaticbooleansetHonorBadge(intcount, Context context){

try{

String launchClassName = getLauncherClassName(context);

if(TextUtils.isEmpty(launchClassName)) {

returnfalse;

}

Bundle bundle = newBundle;

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

returntrue;

} catch(Exception e) {

e.printStackTrace;

returnfalse;

}

}

privatestaticbooleansetHuaweiBadge(intcount, Context context){

try{

String launchClassName = getLauncherClassName(context);

if(TextUtils.isEmpty(launchClassName)) {

returnfalse;

}

Bundle bundle = newBundle;

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

returntrue;

} catch(Exception e) {

e.printStackTrace;

returnfalse;

}

}

privatestaticbooleansetSamsungBadge(intcount, Context context){

try{

String launcherClassName = getLauncherClassName(context);

if(TextUtils.isEmpty(launcherClassName)) {

returnfalse;

}

Intent intent = newIntent( "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);

returntrue;

} catch(Exception e) {

e.printStackTrace;

returnfalse;

}

}

@Deprecated

privatestaticbooleansetOPPOBadge(intcount, Context context){

try{

Bundle extras = newBundle;

extras.putInt( "app_badge_count", count);

context.getContentResolver.call(Uri.parse( "content://com.android.badge/badge"),

"setAppBadgeCount", String.valueOf(count), extras);

returntrue;

} catch(Exception e) {

e.printStackTrace;

returnfalse;

}

}

@Deprecated

privatestaticbooleansetOPPOBadge2(intcount, Context context){

try{

Intent intent = newIntent( "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 = newBundle;

extras.putInt( "app_badge_count", count);

context.getContentResolver.call(Uri.parse( "content://com.android.badge/badge"),

"setAppBadgeCount", null, extras);

}

returntrue;

} catch(Exception e) {

e.printStackTrace;

returnfalse;

}

}

@Deprecated

privatestaticbooleansetVivoBadge(intcount, Context context){

try{

String launcherClassName = getLauncherClassName(context);

if(TextUtils.isEmpty(launcherClassName)) {

returnfalse;

}

Intent intent = newIntent( "launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");

intent.putExtra( "packageName", context.getPackageName);

intent.putExtra( "className", launcherClassName);

intent.putExtra( "notificationNum", count);

context.sendBroadcast(intent);

returntrue;

} catch(Exception e) {

e.printStackTrace;

returnfalse;

}

}

privatestaticbooleansetZukBadge(intcount, Context context){

try{

Bundle extra = newBundle;

ArrayList ids = newArrayList<>;

// 以列表形式传递快捷方式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);

returnbundle != null;

} catch(Exception e) {

e.printStackTrace;

returnfalse;

}

}

privatestaticbooleansetHTCBadge(intcount, Context context){

try{

ComponentName launcherComponentName = getLauncherComponentName(context);

if(launcherComponentName == null) {

returnfalse;

}

Intent intent1 = newIntent( "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 = newIntent( "com.htc.launcher.action.UPDATE_SHORTCUT");

intent2.putExtra( "packagename", launcherComponentName.getPackageName);

intent2.putExtra( "count", count);

context.sendBroadcast(intent2);

returntrue;

} catch(Exception e) {

e.printStackTrace;

returnfalse;

}

}

privatestaticbooleansetSonyBadge(intcount, Context context){

String launcherClassName = getLauncherClassName(context);

if(TextUtils.isEmpty(launcherClassName)) {

returnfalse;

}

try{

//官方给出方法

ContentValues contentValues = newContentValues;

contentValues.put( "badge_count", count);

contentValues.put( "package_name", context.getPackageName);

contentValues.put( "activity_name", launcherClassName);

SonyAsyncQueryHandler asyncQueryHandler = newSonyAsyncQueryHandler(context

.getContentResolver);

asyncQueryHandler.startInsert( 0, null, Uri.parse( "content://com.sonymobile.home"+

".resourceprovider/badge"), contentValues);

returntrue;

} catch(Exception e) {

try{

//网上大部分使用方法

Intent intent = newIntent( "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);

returntrue;

} catch(Exception e1) {

e1.printStackTrace;

returnfalse;

}

}

}

privatestaticString getLauncherClassName(Context context){

ComponentName launchComponent = getLauncherComponentName(context);

if(launchComponent == null) {

return"";

} else{

returnlaunchComponent.getClassName;

}

}

privatestaticComponentName getLauncherComponentName(Context context){

Intent launchIntent = context.getPackageManager.getLaunchIntentForPackage(context

.getPackageName);

if(launchIntent != null) {

returnlaunchIntent.getComponent;

} else{

returnnull;

}

}

staticclassSonyAsyncQueryHandlerextendsAsyncQueryHandler{

SonyAsyncQueryHandler(ContentResolver cr) {

super(cr);

}

}

}

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

下面贴出使用方法

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

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

2.JPushMessageReceiver继承类

@Override

publicvoidonNotifyMessageArrived(Context context, NotificationMessage message){

Log.e(TAG, "[onNotifyMessageArrived] "+ message);

count = count + 1;

AppShortCutUtil.setCount(count, EISApp.appContext);

Log.d( "-=-", "==="+ count);

}

3.最后MainActivity

@Override

protectedvoidonResume{

super.onResume;

if( 0!= PushMessageReceiver.count) {

//角标清空

PushMessageReceiver.count = 0;

AppShortCutUtil.setCount(PushMessageReceiver.count, MainActivity. this);

}

}

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

版权声明:本文为CSDN博主「四月人间v」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zyz18813049204/article/details/95938346 返回搜狐,查看更多

责任编辑:

android 角标数字管理,Android应用推送角标设置方法相关推荐

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

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

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

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

  3. miui android p怎么样,Android P究竟是什么,率先推送机型竟没有小米

    原标题:Android P究竟是什么,率先推送机型竟没有小米 6月21日,诺基亚7 Plus的部分用户收到了Android P Beat 2的推送,这是继索尼Xperia XZ2之后进行的新一次尝鲜版 ...

  4. miui android 9q,小米 9 MIUI Android Q Beta 优先体验版正式推送:轻松升级

    7 月 11 日,小米 MIUI 官微宣布,小米 9 MIUI Android Q Beta 优先体验版现已推送!已获得测试资格的小伙伴已经可以升级体验. 换言之已经获得资格的小米 9 用户现在就可以 ...

  5. fiyme android底层,魅族首批Android 10底层Flyme于今日正式推送

    原标题:魅族首批 Android 10 内测版今日起开始推送 7月21日消息 魅族官方曾于 6 月 25 日宣布为旗下 10 款机型的 Flyme 适配 Android 10 系统底层.从 6 月 2 ...

  6. 小米9android q测试版,小米9 MIUI Android Q Beta优先体验版正式推送:轻松升级

    7 月 11 日,小米MIUI官微宣布,小米9 MIUI Android Q Beta优先体验版现已推送!已获得测试资格的小伙伴已经可以升级体验. 换言之已经获得资格的小米 9 用户现在就可以尝鲜下载 ...

  7. 小米9android q测试版,小米9 Android Q Beta优先体验版已推送:新增深色模式

    原标题:小米9 Android Q Beta优先体验版已推送:新增深色模式 7月12日消息,小米MIUI官方微博称,小米9的MIUI Android Q Beta优先体验版现已推送!已获得测试资格的小 ...

  8. 魅族android n彩蛋,魅族Flyme Android 10首个内测版本已推送 强制开启90Hz彩蛋

    7月21日消息,魅族Flyme based on Android 10 首个内测版本已推送,本次推送机型:16s Pro.16s. 16th Plus.16th目前仍存在异常重启问题未能如期发布,预计 ...

  9. 魅族打开Android彩蛋,魅族 Flyme Android 10 首个内测版本已推送 强制开启 90Hz 彩蛋...

    7 月 21 日消息,魅族 Flyme based on Android 10 首个内测版本已推送,本次推送机型:16s Pro.16s. 16th Plus.16th 目前仍存在异常重启问题未能如期 ...

最新文章

  1. 2021年大数据Spark(五十二):Structured Streaming 事件时间窗口分析
  2. java 国际化例子_JavaSE 国际化 简单例子
  3. oracle12c没有有sqlnet文件,Oracle的sqlnet.ora文件配置
  4. C—蓝彗星(差分问题)
  5. Spring Cloud Sleuth + Zipkin 监控微服务(一)
  6. python汇总json数据_python的json包位置及用法总结
  7. 如何看待基于OpenStack与Docker技术的云计算建设
  8. QDUOJ LC的课后辅导 单调递增栈
  9. Springboot2.2.6中的RSocket使用, RSocket 进行反应式数据传输
  10. android游戏菜鸟教程,菜鸟教程app
  11. fckeditor for php 下载,FCKeditor(HTML在线编辑器)
  12. 一本快速入门ARM64体系结构的编程书
  13. html 语言包,语言包编辑
  14. matlab线性拟合
  15. 真相了!他说:码农和程序员的区别就在这!网友炸锅了
  16. TCP通信协议基本操作
  17. win7不用破解工具,最简单的去黑屏办法
  18. 计算机二级Python错题
  19. 运维笔记(三)服务器介绍和XShell使用
  20. CTSC2016时空旅行

热门文章

  1. git merge的三种操作merge, squash merge, 和rebase merge
  2. 华清远见上海中心22071班 9.30作业
  3. [paper] InsightFace
  4. 华为odjava机试题_华为OD机试 :找终点
  5. NLPChina_ansj_seg JAVA 实现热词及分词统计
  6. 微软高级工程师带你 21 天入门机器学习
  7. Linux实战教学笔记35:企业级监控Nagios实践(下)
  8. 不是竞赛生学计算机专业,非计算机专业计算机设计大赛总结
  9. android高德地图demo,Android :高德地图demo
  10. UltraEdit+注册机+激活方法