为你的应用程序加上数字角标

3,932 阅读3分钟

前两天写了一篇《分享一些比较有用的adb命令》 ,这篇博客受到了很多同学的好评,希望大家继续关注我,以后我会写更好的文章来帮助更多的人。

起因:公司的项目中需要给应用程序加未读消息角标,于是我就网上查了好多资料,最后终于搞定了,下面就是我的结论。方便以后查阅,可以收藏起来哦!

众所周知,在Android系统中不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒,但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差。

今天在论坛上看到了一个帖子,终于搞清了我很久以来的一个困惑,android到底能不能实现ios的角标效果,QQ是怎么实现的。看了这个帖子顿时终于解除了我的困惑。

先说一个下大概的思路:

大家都知道android系统默认是不支持角标的。但是有时候你又可以在很多系统上看到角标,这些系统包括 小米手机的miui 三星手机的TouchWiz 索尼手机; 这些手机的系统应用都可以显示数字角标。这是应为这些系统进行了定制,使用的是自己的launcher. 所以在这些系统上的实现思路就是使用这些手机的私有api来实现显示角标。但是还有一部分手机不支持 实现方法是通过快捷方式,创建一个带角标的应用的快捷方式。需要更新角标的时候就去通过更新快捷方式来实现。


效果图

我这里只介绍Samsung跟Sony两个厂商的如何实现。其他品牌手机请自己摸索

Samsung:
  Samsung的角标操作放在一个叫BadgeProvider的ContentProvider中,它的Uri为:
"content://com.sec.badge/apps"
使用方法为:

在AndroidManifest.xml中加上两个权限:


查看你的APP是否已经注册在BadgeProvider中:

        Uri uri = Uri.parse("content://com.sec.badge/apps");
        Cursor c = getContentResolver().query(uri, null, null, null, null);

        if (c == null) {
            return;
        }
        try {
            if (!c.moveToFirst()) {
                return;
            }
            c.moveToPosition(-1);
            while (c.moveToNext()) {
                String pkg = c.getString(1);
                String clazz = c.getString(2);
                int badgeCount = c.getInt(3);
                Log.d("BadgeTest", "package: " + pkg + ", class: " + clazz
                        + ", count: " + String.valueOf(cnt));
            }
        } finally {
            c.close();
        }

如果没有注册就注册上去:

        ContentValues cv = new ContentValues();
        cv.put("package", getPackageName());
        // Name of your activity declared in the manifest as
        // android.intent.action.MAIN.
        // Must be fully qualified name as shown below
        cv.put("class", "com.example.badge.activity.Test");
        cv.put("badgecount", 1); // integer count you want to display

        // Execute insert
        getContentResolver().insert(Uri.parse("content://com.sec.badge/apps"),
                cv);

如果已经注册了就用下面方法更新角标:

        ContentValues cv = new ContentValues();
        cv.put("badgecount", 0);
        getContentResolver().update(Uri.parse("content://com.sec.badge/apps"),
                cv, "package=?", new String[] { getPackageName() });

如果要取消上标显示就用

intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);

这种做法是很麻烦的,每个厂商都有自己的api,所以你必须要针对各种不同的手机来设置,烦死你,好在github上有个开源库,帮我们很好的解决了这个问题。
github上有一个开源库(leolin310148/ShortcutBadger)对这些适配工作进行了封装,开发者可以很方便地调用该库提供的方法,在特定的Launcher(比如小米、三星、索尼等)上实现数字角标的功能。基于该开源库,我验证过三星、LG和索尼上是有效果的(其他厂商的有待进一步验证),但是在小米上是不行的,查阅资料发现小米Launcher对于自定义角标的方法有做调整,可以参考其官方文档。

还有一款收费的插件, Notifyer+,这个用起来更方便,界面效果已经跟iphone几乎一样了,感兴趣的同学可以去了解一下。

如果觉得我写得好,可以点个赞,关注一下哦~另外,我的微信公众号也开播了,每天都会分享一篇优质的技术文章,欢迎大家来踩点。(公众号:代码也是人)


代码也是人