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);
注意事项
- Bundle 参数中的 class 并非固定的 MainActivity 而是带包名完整路径的启动 Activity,例如:com.test.name.SplashActivity;
- 建议在调用时添加 try-catch 异常处理,防止桌面不支持角标时接口抛异常;
- 若关闭角标显示,可以发送 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(); } }
注意事项
- 小菜测试时收到消息但是没有更新桌面角标,认真阅读官方文档,发现消息类型不能是进度条样式和常驻通知,注意需要 setOngoing(false);
- 小米的桌面角标在点击当前推送消息或点击应用图标时,会自动取消角标数,不用单独处理;
- 小米的桌面角标方式应用场景相对较少,须配合推送消息;
三星 / 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,小菜研究不深,有错误的话请多多指导!
来源: 阿策小和尚
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OkHttp3源码详解(六)Okhttp任务队列工作原理
1 概述 1.1 引言 android完成非阻塞式的异步请求的时候都是通过启动子线程的方式来解决,子线程执行完任务的之后通过handler的方式来和主线程来完成通信。无限制的创建线程,会给系统带来大量的开销。如果在高并发的任务下,启用个线程池,可以不断的复用里面不再使用和有效的管理线程的调度和数量的管理。就可以节省系统的成本,有效的提高执行效率。 1.2 线程池ThreadPoolExecutor okhttp的线程池对象存在于Dispatcher类中。实例过程如下 1. public synchronized ExecutorService executorService() { 2. if (executorService == null) { 3. executorService = , Integer.MAX_VALUE, , TimeUnit.SECONDS, 4. new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false)); 5. } 6. return ex...
- 下一篇
阿里云物联网平台设备影子功能演示
概述 物联网平台提供设备影子功能,用于缓存设备状态。设备在线时,可以直接获取云端指令;设备离线时,上线后可以主动拉取云端指令。设备影子是一个 JSON 文档,用于存储设备上报状态、应用程序期望状态信息。每个设备有且只有一个设备影子,设备可以通过MQTT获取和设置设备影子来同步状态,该同步可以是影子同步给设备,也可以是设备同步给影子。本文使用MQTT.fx工具快速测试设备影子的相关功能。 实验测试 设备影子Topic 物联网平台已为每个设备预定义了两个Topic,用于实现数据流转,可以直接使用。 /shadow/update/${YourProductKey}/${YourDeviceName}设备和应用程序发布消息到此Topic。物联网平台收到该Topic的消息后,将消息中的状态更新到设备影子中。 /shadow/get/${YourProd
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启