Android角标的实现 ,各品牌手机

华为系列

华为官网: 华为角标官方文档

按照华为官方文档的介绍,如果要获得应用角标支持,需要为应用申请华为证书,然后在“权签平台”下载开发者证书,再将开发者证书集成到应用中,整个流程跑下来还是很繁琐的。

那么吃瓜群众肯定就要问了,有没有简单一点的方法呢?答案当然是有的!结合华为的《角标开发指导书》中的代码参考和亲身实践,我发现只需要其中两步,也可以实现华为角标支持(目前只验证了华为mate8 和华为 p7,其他机型手头暂时没有,欢迎大家补充):

  1. 在AndroidManifest.xml中申请华为角标权限
    <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
  2. 参考以下代码,设置应用角标即可
    Bundle bundle = new Bundle();  
    bundle.putString("package", context.getPackageName());  
    String launchClassName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent().getClassName();  
    bundle.putString("class", launchClassName);  
    bundle.putInt("badgenumber", msgCount); 
    context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bundle);
  3. 小米的实现
  4. 小米角标官网: 小米角标官方文档

    在小米机型上,系统默认是支持应用角标的,不过支持的方式非常反人类,导致经常有用户来反馈说角标数字不对的问题。小米官方文档关于默认情况是这么描述的:

    当app向通知栏发送了一条通知 (通知不带进度条并且用户可以删除的),那么桌面app icon角标就会显示1。此时app显示的角标数是和通知栏里app发送的通知数对应的,即向通知栏发送了多少通知就会显示多少角标。

    那么吃瓜群众肯定又要问了,What are you talking about?!不要慌,我举一个例子大家就明白了,比如说千牛客户端,每收到一条未读的聊天消息,就会往通知栏发送一条通知(由于业务需要,通知id都是同一个),假如用户收到了5条未读消息,理论上来说千牛的角标数字应该显示5,但是在小米机型上你会惊奇地发现角标数字居然是1。这是因为默认情况下,应用的角标数字跟应用往通知栏发送的通知数( 注意!这个通知数是根据通知id来计算的 )相对应的,在刚刚说的场景中, 虽然千牛往通知栏发送了5条通知,但是按照通知id来统计时,对应的通知数就是1,所以角标数字也就显示成1了 。

    小米官方可能也意识到了,这个奇葩的设计会导致很多用户产生困惑,所以在官方文档中也提供了修改角标数的接口。不同于其他手机系统通过广播来修改角标,小米系统是通过反射机制来修改角标,关键代码参考如下:

    Field field = notification.getClass().getDeclaredField("extraNotification");
    Object extraNotification = field.get(notification);
    Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);
    method.invoke(extraNotification, unreadCount);

    VIVO系列

  5. 由于我本人的手机及时vivo

  6. 做角标的时候一直找不到dome 费了很大功夫 起始很简单
  7. 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", msgCount);context.sendBroadcast(intent);



主要难点是 小米的手机 小米简直就是丧心病狂 推送栏与角标绑定 十分不好操作,至今我还没找到好的解决办法,希望以后多交流
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在华为手机上,可以通过 BadgeProvider 提供的 API 来设置应用的角标数。具体实现方法如下: 1. 首先,需要在 AndroidManifest.xml 文件中注册一个广播接收器,用于接收设置应用角标数的请求。代码如下: ```xml <receiver android:name=".BadgeReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BADGE_COUNT_UPDATE" /> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" /> </intent-filter> </receiver> ``` 2. 在 BadgeReceiver 中处理接收到的设置应用角标数的请求。代码如下: ```java public class BadgeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() != null) { switch (intent.getAction()) { case "android.intent.action.BADGE_COUNT_UPDATE": // 获取应用的包名和角标数 String packageName = intent.getStringExtra("badge_package_name"); int badgeCount = intent.getIntExtra("badge_count", 0); // 设置应用的角标数 setBadgeCount(context, packageName, badgeCount); break; case "android.intent.action.PACKAGE_REPLACED": // 应用更新后需要重新设置角标数 setBadgeCount(context, context.getPackageName(), 0); break; } } } /** * 设置应用的角标数 */ private void setBadgeCount(Context context, String packageName, int badgeCount) { try { Bundle extras = new Bundle(); extras.putString("package", packageName); extras.putString("class", getLauncherClassName(context)); extras.putInt("badgenumber", badgeCount); context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extras); } catch (Exception e) { e.printStackTrace(); } } /** * 获取应用的启动 Activity 的类名 */ private String getLauncherClassName(Context context) { PackageManager pm = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setPackage(context.getPackageName()); List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); if (resolveInfos != null && resolveInfos.size() > 0) { return resolveInfos.get(0).activityInfo.name; } return ""; } } ``` 3. 在应用中设置角标数时,可以通过 Intent 来发送广播请求。代码如下: ```java int badgeCount = 10; Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); intent.putExtra("badge_package_name", getPackageName()); intent.putExtra("badge_count", badgeCount); sendBroadcast(intent); ``` 需要注意的是,华为手机上的角标数设置功能只在 EMUI 4.1 及以上版本上支持。如果您的应用需要在其他手机上设置角标数,可以使用第三方库 ShortcutBadger。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值