Android 实现应用桌面角标

Android 实现应用桌面角标Android8 0 之前原生是不支持应用角标的 是各个手机厂商自己在系统中实现的应用角标 并且部分厂商提供了设置的方式 所以需要对各个厂商的系统进行适配

大家好,欢迎来到IT知识分享网。

1. Android 实现应用桌面角标

  Android 8.0之前原生是不支持应用角标的,是各个手机厂商自己在系统中实现的应用角标,并且部分厂商提供了设置的方式,所以需要对各个厂商的系统进行适配。

1.1. 各机型适配

1.1.1. 小米手机

官方文档:文档中心
  小米在MIUI6及以上版本中是通过发送通知来设置角标的。当APP向通知栏发送了一条通知 (通知不带进度条并且用户可以删除的),那么桌面APP icon角标就会显示1。此时app显示的角标数是和通知栏里app发送的通知数对应的,即向通知栏发送了多少通知就会显示多少角标。
  可以通过反射机制来定义每次通知的消息个数,应用的角标数为每条通知定义的通知个数的总和。
  我们发送了两条通知,一条通知为5个消息,一条为10个消息,应用角标显示为15个。此时,如果用户点击或移除掉5条消息的那个通知,应用角标会变成10。
  另外,仅在APP在后台时收到通知会显示角标,而APP在前台时不会显示,APP被杀掉后通知及角标消失。

 / * 小米手机创建通知信息并创建角标 * * @param context * @param num */ public static void setXiaoMiBadgeNum(Context context, int num) { 
    Log.e(TAG, "--------setXiaoMiBadgeNum----------"); 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.ic_launcher) .setAutoCancel(true) .setChannelId("default") .setNumber(num)//桌面角标数量 .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL) .build(); //取消掉上一条通知消息 notificationManager.cancel(notificationId); try { 
    Field field = notification.getClass().getDeclaredField("extraNotification"); Object extraNotification = field.get(notification); Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class); method.invoke(extraNotification, num); } catch (Exception e) { 
    e.printStackTrace(); } notificationManager.notify(notificationId, notification); } 

  需要注意以下几点:
(1)发送通知必须当app处于后台才会生成桌面角标,否则只会生成一次。
(2)该方法目前支持到miui12.

1.1.2. 三星手机

  已在三星s7dege+上,Android8.0上通过

 public static void setSamSungBadgeNum(Context context,int num){ 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.mipmap.ic_launcher) .setWhen(System.currentTimeMillis()) .setAutoCancel(true); mBuilder.setContentTitle("test"); mBuilder.setTicker("test"); mBuilder.setContentText("test"); //点击set 后,app退到桌面等待3s看效果(有的launcher当app在前台设置未读数量无效) final Notification notification = mBuilder.build(); sendBadgeNotification(notification, notificationId, context, num, num); } / * 重置、清除Badge未读显示数<br/> * * @param context */ public static void resetBadgeCount(Context context) { 
    sendBadgeNotification(null, 0, context, 0, 0); } public static void sendBadgeNotification(Notification notification, int notifyID, Context context, int thisNotifyCount, int count) { 
    if (count <= 0) { 
    count = 0; } else { 
    count = Math.max(0, Math.min(count, 99)); } executeBadge(context, notification, notifyID, thisNotifyCount, count); } public static void executeBadge(Context context, Notification notification, int notificationId, int thisNotificationCount, int count) { 
    setNotification(notification, notificationId, context); String launcherClassName = getLauncherClassName(context); if (launcherClassName == null) { 
    return; } 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); } protected static void setNotification(Notification notification, int notificationId, Context context) { 
    if (notification != null) { 
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(notificationId, notification); } } protected static String getLauncherClassName(Context context) { 
    PackageManager packageManager = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); // To limit the components this Intent will resolve to, by setting an // explicit package name. intent.setPackage(context.getPackageName()); intent.addCategory(Intent.CATEGORY_LAUNCHER); // All Application must have 1 Activity at least. // Launcher activity must be found! ResolveInfo info = packageManager .resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); // get a ResolveInfo containing ACTION_MAIN, CATEGORY_LAUNCHER // if there is no Activity which has filtered by CATEGORY_DEFAULT if (info == null) { 
    info = packageManager.resolveActivity(intent, 0); } return info.activityInfo.name; } 

1.1.3. 华为

  可以通过ContentResolver方法直接设置应用角标,且应用在前台和被杀掉后仍可显示。

 <!--华为手机更新应用桌面角标需要的权限--> <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/> private void setHUAWEIIconBadgeNum(Context context,int count) { 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.mipmap.ic_launcher) .setWhen(System.currentTimeMillis()) .setAutoCancel(true); mBuilder.setContentTitle("test"); mBuilder.setTicker("test"); mBuilder.setContentText("test"); //点击set 后,app退到桌面等待3s看效果(有的launcher当app在前台设置未读数量无效) final Notification notification = mBuilder.build(); setNotification(notification, notificationId, context); Bundle bunlde = new Bundle(); bunlde.putString("package", context.getPackageName()); bunlde.putString("class", getLauncherClassName(context)); bunlde.putInt("badgenumber", count); context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bunlde); } 

1.1.4. OPPO

  首先,官方客服和我说他们可以支持,但需要申请。
  而抱歉的是截止目前我还没有得到具体的方法,因为我们还在它的申请流程中。。
  具体申请流程请去OPPO开放平台找他们的人工客服获取申请方法。

public static void setBadgeNumber(Context context, int number) { 
    try { 
    if (number == 0) { 
    number = -1; } Intent intent = new Intent("com.oppo.unsettledevent"); intent.putExtra("pakeageName", context.getPackageName()); intent.putExtra("number", number); intent.putExtra("upgradeNumber", number); if (canResolveBroadcast(context, intent)) { 
    context.sendBroadcast(intent); } else { 
    try { 
    Bundle extras = new Bundle(); extras.putInt("app_badge_count", number); context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, extras); } catch (Throwable t) { 
    t.printStackTrace(); } } } catch (Exception e) { 
    e.printStackTrace(); } } public static boolean canResolveBroadcast(Context context, Intent intent) { 
    PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> receivers = packageManager.queryBroadcastReceivers(intent, 0); return receivers != null && receivers.size() > 0; } 

1.1.5. VIVO

官方文档:vivo开放平台

public static void setBadgeNumber(Context context, int number) { 
    try { 
    Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM"); intent.putExtra("packageName", context.getPackageName()); String launchClassName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent().getClassName(); intent.putExtra("className", launchClassName); intent.putExtra("notificationNum", number); context.sendBroadcast(intent); } catch (Exception e) { 
    e.printStackTrace(); } } 

1.2. 完整代码

public class MobileConfigUtil { 
    / * @return 手机类型 华为、小米、vivo、oppo * @desc 获取手机类型 */ public static String getMobileType() { 
    return Build.MANUFACTURER; } / * @desc 根据手机机型进入app自启动页面 */ public static void jumpStartInterface(Context context) { 
    Intent intent = new Intent(); try { 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ComponentName componentName = null; if (getMobileType().equals("Xiaomi")) { 
    // 小米、红米 // componentName = new ComponentName( // "com.miui.securitycenter", // "com.miui.permcenter.autostart.AutoStartManagementActivity"); // 在此根据用户手机当前版本跳转系统设置界面 intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); } else if (getMobileType().equals("Letv")) { 
    // 乐视 intent.setAction("com.letv.android.permissionautoboot"); } else if (getMobileType().equals("samsung")) { 
    // 三星 componentName = ComponentName.unflattenFromString( "com.samsung.android.sm_cn/com.samsung.android.sm.ui.ram.AutoRunActivity"); } else if (getMobileType().equals("HONOR") // 荣耀 || getMobileType().equals("HUAWEI") // 华为 || getMobileType().equals("NOVA")) // nova { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    componentName = new ComponentName( "com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity"); } else { 
    componentName = new ComponentName( "com.huawei.systemmanager", "com.huawei.systemmanager.com.huawei.permissionmanager.ui.MainActivity"); } } else if (getMobileType().equals("vivo")) { 
    // vivo // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 
    // componentName = new ComponentName( // "com.vivo.permissionmanager", // "com.vivo.permissionmanager.activity.PurviewTabActivity"); // } else { 
    // componentName = ComponentName // .unflattenFromString("com.iqoo.secure/.MainActivity");//i管家 // } // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 在此根据用户手机当前版本跳转系统设置界面 intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); } else if (getMobileType().equals("Meizu")) { 
   //魅族 //魅族内置手机管家界面 componentName = ComponentName.unflattenFromString("com.meizu.safe" + "/.permission.PermissionMainActivity"); } else if (getMobileType().equals("OPPO")) { 
    // OPPO if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 
    componentName = new ComponentName( "com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity"); } else { 
    componentName = new ComponentName( "com.color.safecenter", "com.color.safecenter.permission.startup.StartupAppListActivity"); } } else if (getMobileType().equals("ulong")) { 
    // 360手机 componentName = new ComponentName( "com.yulong.android.coolsafe", ".ui.activity.autorun.AutoRunListActivity"); } else { 
    // 在此根据用户手机当前版本跳转系统设置界面 intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); } intent.setComponent(componentName); context.startActivity(intent); } catch (Exception e) { 
   //抛出异常就直接打开设置页面 intent = new Intent(Settings.ACTION_SETTINGS); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); Log.e("HLQ_Struggle", "抛出异常就直接打开设置页面"); } } / * @desc 去配置界面 */ public static void goConfigPage(Context context) { 
    Intent intent = new Intent(Settings.ACTION_SETTINGS); intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); context.startActivity(intent); } } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/158304.html

(0)
上一篇 2025-01-24 21:00
下一篇 2025-01-24 21:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信