前两天写了一篇《分享一些比较有用的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几乎一样了,感兴趣的同学可以去了解一下。
如果觉得我写得好,可以点个赞,关注一下哦~另外,我的微信公众号也开播了,每天都会分享一篇优质的技术文章,欢迎大家来踩点。(公众号:代码也是人)
代码也是人