android 角标数字管理,Android应用推送角标设置方法
原标题: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应用推送角标设置方法相关推荐
- 极光推送 角标清0 未读消息不清空
不要调用 [UIApplication sharedApplication].applicationIconBadgeNumber = 0; 角标和通知栏未读推送都会清空 使用下面的方法... - ( ...
- php 友盟推送角标,桌面角标设置以及消息推送服务
更新记录 0.01(2020-05-09) 1.添加角标设置 2.添加清除角标 3.添加品牌获取 4.添加通知栏推送 5.添加点击通知栏进入APP 平台兼容性 Android iOS × 原生插件通用 ...
- miui android p怎么样,Android P究竟是什么,率先推送机型竟没有小米
原标题:Android P究竟是什么,率先推送机型竟没有小米 6月21日,诺基亚7 Plus的部分用户收到了Android P Beat 2的推送,这是继索尼Xperia XZ2之后进行的新一次尝鲜版 ...
- miui android 9q,小米 9 MIUI Android Q Beta 优先体验版正式推送:轻松升级
7 月 11 日,小米 MIUI 官微宣布,小米 9 MIUI Android Q Beta 优先体验版现已推送!已获得测试资格的小伙伴已经可以升级体验. 换言之已经获得资格的小米 9 用户现在就可以 ...
- fiyme android底层,魅族首批Android 10底层Flyme于今日正式推送
原标题:魅族首批 Android 10 内测版今日起开始推送 7月21日消息 魅族官方曾于 6 月 25 日宣布为旗下 10 款机型的 Flyme 适配 Android 10 系统底层.从 6 月 2 ...
- 小米9android q测试版,小米9 MIUI Android Q Beta优先体验版正式推送:轻松升级
7 月 11 日,小米MIUI官微宣布,小米9 MIUI Android Q Beta优先体验版现已推送!已获得测试资格的小伙伴已经可以升级体验. 换言之已经获得资格的小米 9 用户现在就可以尝鲜下载 ...
- 小米9android q测试版,小米9 Android Q Beta优先体验版已推送:新增深色模式
原标题:小米9 Android Q Beta优先体验版已推送:新增深色模式 7月12日消息,小米MIUI官方微博称,小米9的MIUI Android Q Beta优先体验版现已推送!已获得测试资格的小 ...
- 魅族android n彩蛋,魅族Flyme Android 10首个内测版本已推送 强制开启90Hz彩蛋
7月21日消息,魅族Flyme based on Android 10 首个内测版本已推送,本次推送机型:16s Pro.16s. 16th Plus.16th目前仍存在异常重启问题未能如期发布,预计 ...
- 魅族打开Android彩蛋,魅族 Flyme Android 10 首个内测版本已推送 强制开启 90Hz 彩蛋...
7 月 21 日消息,魅族 Flyme based on Android 10 首个内测版本已推送,本次推送机型:16s Pro.16s. 16th Plus.16th 目前仍存在异常重启问题未能如期 ...
最新文章
- 2021年大数据Spark(五十二):Structured Streaming 事件时间窗口分析
- java 国际化例子_JavaSE 国际化 简单例子
- oracle12c没有有sqlnet文件,Oracle的sqlnet.ora文件配置
- C—蓝彗星(差分问题)
- Spring Cloud Sleuth + Zipkin 监控微服务(一)
- python汇总json数据_python的json包位置及用法总结
- 如何看待基于OpenStack与Docker技术的云计算建设
- QDUOJ LC的课后辅导 单调递增栈
- Springboot2.2.6中的RSocket使用, RSocket 进行反应式数据传输
- android游戏菜鸟教程,菜鸟教程app
- fckeditor for php 下载,FCKeditor(HTML在线编辑器)
- 一本快速入门ARM64体系结构的编程书
- html 语言包,语言包编辑
- matlab线性拟合
- 真相了!他说:码农和程序员的区别就在这!网友炸锅了
- TCP通信协议基本操作
- win7不用破解工具,最简单的去黑屏办法
- 计算机二级Python错题
- 运维笔记(三)服务器介绍和XShell使用
- CTSC2016时空旅行
热门文章
- git merge的三种操作merge, squash merge, 和rebase merge
- 华清远见上海中心22071班 9.30作业
- [paper] InsightFace
- 华为odjava机试题_华为OD机试 :找终点
- NLPChina_ansj_seg JAVA 实现热词及分词统计
- 微软高级工程师带你 21 天入门机器学习
- Linux实战教学笔记35:企业级监控Nagios实践(下)
- 不是竞赛生学计算机专业,非计算机专业计算机设计大赛总结
- android高德地图demo,Android :高德地图demo
- UltraEdit+注册机+激活方法