Android 桌面角标二三事

简介: Android 角标学习一下!

      我们广大用户对于通知消息栏和桌面角标都很熟悉,Google Android 是在 8.0 以后加入的,但是对于部分国内厂商较早就有尝试,小菜今天对桌面角标进行简单尝试;

华为厂商

      对于桌面角标的兼容处理,华为是最明确最容易处理的,官方文档 清晰明了,小菜按照官方介绍尝试如下:

集成方式

1. 权限声明
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
2. 设置基本参数并将角标数传递给桌面应用
public static void setHuaweiBadge(Context context, int count) {
    try {
        Bundle badgeBundle = new Bundle();
        badgeBundle.putString("package", "包名");
        badgeBundle.putString("class", "启动页");
        badgeBundle.putInt("badgenumber", count);
        context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, badgeBundle);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
3. 在需要的位置调用设置桌面角标
setHuaweiBadge(getApplicationContext(), 10);

注意事项

  1. Bundle 参数中的 class 并非固定的 MainActivity 而是带包名完整路径的启动 Activity,例如:com.test.name.SplashActivity;
  2. 建议在调用时添加 try-catch 异常处理,防止桌面不支持角标时接口抛异常;
  3. 若关闭角标显示,可以发送 count = 0 的接口调用,可以根据需求在进入/退出 app 或前后台切换时进行角标的变更;

小米厂商

      小米官网 提供了明确的角标处理方式,但小米的处理方式必须依赖通知栏消息才可以对桌面角标进行处理;

集成方式

1. 发送通知消息,注意 Android 8.0 以后需要设置通知渠道
private void notifyChannel() {
    NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(
        android.content.Context.NOTIFICATION_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel =
            new NotificationChannel(Constants.PUSH_CHANNEL_ID, "mi_push",
                NotificationManager.IMPORTANCE_HIGH);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
        }
    }
    Notification notification = new NotificationCompat.Builder(this, "mi_push")
        .setContentTitle("您收到一条消息")
        .setContentText("设置桌面角标")
        .setWhen(System.currentTimeMillis())
        .setSmallIcon(R.drawable.icon)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
        .setAutoCancel(true)
        .build();

    getMiBadge(notification, 10);
    notificationManager.notify(1, notification);
}
2. 在发送通知时,设置角标数
public static void getMiBadge(Notification notification, int count) {
    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();
    }
}

注意事项

  1. 小菜测试时收到消息但是没有更新桌面角标,认真阅读官方文档,发现消息类型不能是进度条样式和常驻通知,注意需要 setOngoing(false)
  2. 小米的桌面角标在点击当前推送消息或点击应用图标时,会自动取消角标数,不用单独处理;
  3. 小米的桌面角标方式应用场景相对较少,须配合推送消息;

三星 / LG 厂商

      三星和 LG 厂商的集成方式一致;都是通过广播发送通知,然后再展示桌面角标;

集成方式

1. 权限声明
<uses-permission android:name="com.sec.android.provider.badge.permission.READ" />
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" />
2. 发送广播,参数传递内容基本与华为方式一致,注意 class_name 为启动页完整路径
private static void setSumsungBadge(Context context, int count) {
    Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
    intent.putExtra("badge_count", count);
    intent.putExtra("badge_count_package_name", "包名");
    intent.putExtra("badge_count_class_name", "启动页");
    context.sendBroadcast(intent);
}
3. 在需要的位置调用设置桌面角标
setSumsungBadge(getApplicationContext(), 10);

联想 ZUK 厂商

      联想 ZUK 厂商在开发者平台上提供了具体的角标展示方案,其中可设置 ids 对多图标设置角标,小菜仅尝试了主 app 图标角标展示;

集成方式

1. 权限声明
<uses-permission android:name="android.permission.READ_APP_BADGE"/>
2. 可根据 ids 对具体图标进行角标展示,也可以简化直接设置主图标角标
private static void setZUKBadge(Context context, int count) {
    Bundle extra = new Bundle();
    extra.putInt("app_badge_count", count);
    context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, extra);
}
3. 在需要的位置调用设置桌面角标
setZUKBadge(getApplicationContext(), 10);

OPPO 厂商

      OPPO 开发者平台未提供处理桌面角标的方法,联系客服需要提供相关材料申请角标权限,原则上只通过应用的 IM 类提醒功能角标申请;申请之后 OPPO 相关工作人员会单独建群指导说明,小菜测试应用未通过要求,暂不支持;

VIVO / 魅族厂商

      查阅 VIVO / 魅族 开发者平台,明确指出暂不支持桌面角标的展示,故小菜暂未尝试;


      为了良好的用户体验,桌面角标的展示应慎重合理,这也是部分尝试暂不提供桌面角标展示的原因;而且在国内的应用大部分需要单独集成各厂商的 SDK,小菜研究不深,有错误的话请多多指导!

来源: 阿策小和尚

目录
相关文章
|
7月前
|
XML Java Android开发
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
213 0
|
Android开发 架构师
Android:动态更换桌面ICON
前言 当老板和产品提出这种需求的时候,我并不感到害怕,心里甚至有点窃喜,因为大厂基本都有这种效果,那肯定也好实现。当我一查资料的时候,发现情况不容乐观。
3885 0
|
7月前
|
Java Android开发
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
125 1
|
7月前
|
Java Android开发
Android 长按桌面显示菜单的代码
Android 长按桌面显示菜单的代码
48 0
|
7月前
|
XML Java Android开发
Android Studio App开发之通知渠道NotificationChannel及给华为、小米手机桌面应用添加消息数量角标实战(包括消息重要级别的设置 附源码)
Android Studio App开发之通知渠道NotificationChannel及给华为、小米手机桌面应用添加消息数量角标实战(包括消息重要级别的设置 附源码)
814 0
|
XML 测试技术 API
【Android开发日常】一文弄懂桌面图标快捷菜单 & 桌面小组件
开发可以定义快捷方式,以便在应用中执行特定操作。 这些快捷方式可在受支持的启动器或助理(如 Google 助理)中显示,方便用户快速启动应用中的常见任务或推荐任务。 通过本文你还将了解一些可提升快捷方式效果的最佳做法。
1108 1
|
双11 Android开发
Android动态来改变App桌面图标
其实对于这样的一个桌面图标更换,Android中为我们提供了AndroidManifest.xml里的<activity-alias>标签实现方式。
360 0
|
XML 缓存 数据库
Android桌面小部件开发,及注意事项
Android桌面小部件开发,及注意事项
500 0
|
Web App开发 监控 安全
开发者曝 Android 13 “彩蛋”功能!虚拟化支持运行 Windows 11 和桌面版 Linux
开发者曝 Android 13 “彩蛋”功能!虚拟化支持运行 Windows 11 和桌面版 Linux
567 0
开发者曝 Android 13 “彩蛋”功能!虚拟化支持运行 Windows 11 和桌面版 Linux
|
开发工具 Android开发 开发者
Android 角标适配
Android 角标适配
774 0