• 参考: http://dev.xiaomi.com/doc/p=3904/index.html http://my.oschina.net/ososchina/blog/352286?p=1#comments http://www.voidcn.com/blog/kongbaidepao/article/p-62251.html ...
    
    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51082574    文章出自:[薛瑄的博客](http://blog.csdn.net/xx326664162)
    
    你也可以查看我的其他同类文章,也会让你有一定的收货
    
    
    
    Android系统 小米,三星,索尼手机发送桌面快键提醒数字图标,在Android系统中,众所周知不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒。
    
    但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差。但幸运的是,某些ROM厂商提供了私有的API,但也带来了难度,API的不同意意味着代码量的增加和兼容性问题更加突出。
    
    我们现在来实现桌面logo或者说icon右上角的图标,先来看2张图,第一张来自互联网,第二张来自个人实践!(由于实验条件有限,只能测试小米的(⊙o⊙)…,有兴趣的同学测试一下其他的吧)
    
    
    
    
    ![这里写图片描述](https://img-blog.csdn.net/20160406171124435)  ![这里写图片描述](https://img-blog.csdn.net/20160406171134639)
    
    实现原理:
    =====
    
    首先我们要明白 并不是应用本身处理对启动图标进行修改、图标的动态修改的过程主要是在Launcher里面完成的.在应用安装,更新,卸载的时候,都会有广播发出,Launcher在LauncherApplication 中注册广播,在LauncherModel中处理接收到广播的消息,重新加载更新应用信息(如:应用图标、文字等)。但是原生的android系统是并不支持该特性的(即不能通过发送特定的系统广播 达到动态修改启动图标的效果),但是在强大的第三方Android手机厂商(如:三星、小米)的系统源码深度定制下、通过修改了Launcher源代码,增加/注册了新的广播接收器用来接收应用发送来的未读消息数广播,接收到广播后,系统将未读消息的数目显示事件交给Launcher去处理,调用相关方法去重绘应用的icon,最终达到动态更新应用图标的效果。
    
    
    MIUI 桌面角标官方开源代码简介
    ===============
    
    参考:http://dev.xiaomi.com/doc/p=3904/index.html
    
    MIUI 6上重新设计了桌面app图标的角标显示,基本规则如下:
    
    基本介绍
    ----
    
    - 默认的情况
    当app 向通知栏发送了一条通知 (通知不带进度条并且用户可以删除的),那么桌面app icon角标就会显示1.此时app显示的角标数是和通知栏里app发送的通知数对应的,即向通知栏发送了多少通知就会显示多少角标。
    
    - 通知可以定义角标数
    例如 有5封未读邮件,通知栏里只会显示一条通知,但是想让角标显示5. 可以在发通知时加个标示。
    实现代码
    
    第三方app需要用反射来调用,参考代码:
    
    ```
    NotificationManager mNotificationManager = (NotificationManager) this
    
    .getSystemService(Context.NOTIFICATION_SERVICE);
    
     
    
    Notification.Builder builder = new Notification.Builder(this)
    
    .setContentTitle(“title”).setContentText(“text”).setSmallIcon(R.drawable.icon);
    
    Notification notification = builder.build();
    
    try {
    
    Field field = notification.getClass().getDeclaredField(“extraNotification”);
    
    Object extraNotification = field.get(notification);
    
    Method method = extraNotification.getClass().getDeclaredMethod(“setMessageCount”, int.class);
    
    method.invoke(extraNotification, mCount);
    
    } catch (Exception e) {
    
    e.printStackTrace();
    
    }
    
    mNotificationManager.notify(0,notification);
    ```
    
    
    显示角标工具类
    ==
    
    **注意:示例源代码中MIUI系统的功能实现和官方介绍的方法不一样,工具类使用的是官方介绍的方法**
    
    这个工具类,参考的[这篇博客](http://blog.csdn.net/janice0529/article/details/44344169)的MIUI系统测试无效,我改了一下,小米测试可以。sony和三星未测试
    
    工具类下载地址:http://download.csdn.net/detail/xx326664162/9484065
    
    
    
    源代码
    ---
    ```
    package cn.hdnc.BadgeUtil;
    
    import android.app.Notification;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.os.Build;
    import android.widget.Toast;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     * 应用启动图标未读消息数显示 工具类  (效果如:QQ、微信、未读短信 等应用图标)
     * 依赖于第三方手机厂商(如:小米、三星)的Launcher定制、原生系统不支持该特性
     * 该工具类 支持的设备有 小米、三星、索尼【其中小米、三星亲测有效、索尼未验证】
     * @author ice_zhengbin@163.com
     *
     */
    public class BadgeUtil {
    
        /**
         * Set badge count
         * 针对 Samsung / xiaomi / sony 手机有效
         * @param context The context of the application package.
         * @param count Badge count to be set
         */
        public static void setBadgeCount(Notification notification,Context context, int count) {
            if (count 这种发送必须是miui 6才行
    
                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();
                // miui 6之前的版本
                Intent localIntent = new Intent(
                        "android.intent.action.APPLICATION_MESSAGE_UPDATE");
                localIntent.putExtra(
                        "android.intent.extra.update_application_component_name",
                        context.getPackageName() + "/" + getLauncherClassName(context));
                localIntent.putExtra(
                        "android.intent.extra.update_application_message_text", String.valueOf(count == 0 ? "" : count));
                context.sendBroadcast(localIntent);
            }
        }
    
    
        /**
         * 向索尼手机发送未读消息数广播
         * 据说:需添加权限: [未验证]
         * @param count
         */
        private static void sendToSony(Context context, int count){
            String launcherClassName = getLauncherClassName(context);
            if (launcherClassName == null) {
                return;
            }
    
            boolean isShow = true;
            if (count == 0) {
                isShow = false;
            }
            Intent localIntent = new Intent();
            localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
            localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE",isShow);//是否显示
            localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME",launcherClassName );//启动页
            localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count));//数字
            localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());//包名
            context.sendBroadcast(localIntent);
        }
    
    
        /**
         * 向三星手机发送未读消息数广播
         * @param count
         */
        private static void sendToSamsumg(Context context, int count){
            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);
        }
    
    
        /**
         * 重置、清除Badge未读显示数
         * @param context
         */
        public static void resetBadgeCount(Notification notification,Context context) {
            setBadgeCount(notification, context, 0);
        }
    
    
        /**
         * Retrieve launcher activity name of the application from the context
         *
         * @param context The context of the application package.
         * @return launcher activity name of this application. From the
         *         "android:name" attribute.
         */
        private 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;
        }
    
    }
    ```
    
    
    拓展
    ==
    
    https://github.com/leolin310148/ShortcutBadger克隆这个项目,可能会碰到如下两个问题:
    
    http://blog.csdn.net/xx326664162/article/details/51083400
    http://blog.csdn.net/xx326664162/article/details/51087827
    
    测试发现小米手机不能实现角标功能,其它手机暂未测试
    
    
    ----------
    
    
    又在网上搜索了好久,感觉这个还不错,还没有亲测
    http://www.jianshu.com/p/0992ff9eeeb6
    
    
    参考:
    http://my.oschina.net/ososchina/blog/352286?p=1#comments
    http://www.voidcn.com/blog/kongbaidepao/article/p-62251.html
    http://www.eoeandroid.com/thread-557210-1-1.html
    
    
    
    >**关注我的公众号,轻松了解和学习更多技术**
    ![这里写图片描述](https://img-blog.csdn.net/2018090521423899?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h4MzI2NjY0MTYy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    展开全文
  • 在做一些推送服务的时候,想在应用图标上添加未读消息,Android桌面角标的适配确实是非常坑爹的需求。原生系统根本就没有这个功能,国内很多厂家效仿ios都自己定义了该功能。现在就为大家介绍部分机型添加角标的代码...
  • android 为桌面图标添加数字角标 我的github项目 BadgeForAppIcon 看完麻烦 star 一下 在某些app的设计中,产品经理总会想当然的提出为桌面图标添加数字角标的需求。作为一个开发者当然只能努力的去实现,然后你...
  • import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Build;import java.lang.reflect.Field;/...
  • 一个应用要实现这个效果,就要在自己有未读的消息的时候发送一个广播告诉系统我有未处理的事件了(例如:短信,电话和邮件等),同时将相关的信息进行保存,比如应用的名称(这里指的是ComponentName)和未处理事件的数量....
  • 最近在用 Xamarin 做一个 Android 应用,打开应用时,如果有新消息,需要在应用内的 Toolbar 或者首页的图标上显示数字提示。在这里和大家分享一下实现方法,如果你有更新好的实现方法,欢迎分享。 类似推特客户端...
  • 现在要求是后台有推送消息,现在需要把接收到的推送消息用一个红色数字显示到应用程序图标的右上角,IOS的APP基本都有这个效果,可是安卓怎么去实现呢?我现在目前已经实现了在手机桌面上创建和修改了图标了,但是...
  • * 针对国内支持的Launcher分别开发,支持为: * ** 常见机型及是否支持 * *** 华为 支持 * 小米 支持 * OPPO 可以支持但需要申请 * VIVO 不支持 ...1.在使用之前首先 初始化 ,三个方法的参数分别是 应用...
  • Android应用图标上的小红点Badge实现 为了增加APP的日活,在Android中有许多的应用仿苹果的在应用图标上显示小红点。当然有着一些手机ROM对小红点的支持,比如小米,三星等。 我们下面看下如何实现: ...
  • Android桌面图标显示数字 2019-12-20 16:57:28
    转发两个比较好的Demo。 https://github.com/leolin310148/ShortcutBadger https://github.com/xuyisheng/ShortcutHelper https://blog.csdn.net/weixin_42976236/article/details/81704627这个解释比较好 ...
  •  在Android原生系统中,众所周知不支持桌面图标显示未读消息提醒的数字,虽然第三方控件BadgeView可以实现应用内的数字提醒。但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,...
  • 对于放置于桌面上的应用图标,系统具有两个接口允许所有的应用通过广播的方式进行删除和添加; 例如: static final String ACTION_INSTALL = "com.android.launcher.action.INSTALL_SHORTCUT"; static
  • 最近有一个需求就是需要把购物车的图标右上角加一个数字 自定义ImageView如下: public class NumImageView extends ImageView { //要显示的数量数量 private int num = 0; //红色圆圈的半径 private ...
  • 更新应用图标显示应用通知消息数量的方法有很多,介绍一个第三方库的方法,简单实用:步骤:1.在项目的build.gradle中添加:repositories { mavenCentral() }2.添加依赖,app包中的build.gradle中添加:compile '...
  • First of all Create a Qt Widgets application project for Android. (if you don’t have Qt for Android installed on your computer then you can refer to this post on how to get it done!) 先创建一个...
  • 本文主要介绍了Android应用程序的icon添加未读消息个数提示(红圈内数字)的方法。具有很好的参考价值。
1 2 3 4 5 ... 20
收藏数 14,077
精华内容 5,630