安卓桌面图标未读数字

再不写个安卓技术文,都要忘了自己其实是做安卓的了。

今天要是实现的就是这种东西

说实话,有点恶心。每次支付宝微信什么的这种未读标志出现的时候就忍不住去点。

好了,我的学习流程是这样的,先在网上搜了下:

看了几篇之后,发现 这个 写的比较用心,除了无形狗粮。

然后找到了 Github 上面的 这个,应该是用的人最多的了。

使用起来非非常的方便:

新建了个工程,在布局中简单写了两个 Button ,一个用来添加未读的标志,一个用来消除未读的标记。

1
2
3
4
5
6
7
8
9
10
11
<Button
android:text="addCount"
android:id="@+id/bt_addCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<Button
android:text="removeCount"
android:id="@+id/bt_removeCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

然后在代码中添加按钮的点击事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mBtAddCount = (Button) findViewById(R.id.bt_addCount);
mBtAddCount.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ShortcutBadger.isBadgeCounterSupported(getApplicationContext())) {
ShortcutBadger.applyCount(getApplicationContext(),1);
Toast toast = Toast.makeText(getApplicationContext(),"标记已添加",Toast.LENGTH_SHORT);
toast.show();
}
}
});
mBtRemove = (Button) findViewById(R.id.bt_removeCount);
mBtRemove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ShortcutBadger.isBadgeCounterSupported(getApplicationContext())) {
ShortcutBadger.removeCount(getApplicationContext());
Toast toast = Toast.makeText(getApplicationContext(),"标记已清除",Toast.LENGTH_SHORT);
toast.show();
}
}
});

灰常快,然后在真机上试了下,能用。(手头只有自己使用的手机,华为荣耀 6。)

再然后,看源码。

怎么说呢,可以这样理解。桌面屏幕其实也是个 Activity 界面,是一个类,Launcher 。修改桌面图标其实就是传一些参数进去,然后调用里面的修改图标的方法。(这个方法各个厂商的实现方式可能都是不一样的,原生其实是没有的,因为有强大的通知栏了,为何要整这种逼死强迫症的东西呢)

需要的参数有包名,类名,和想要设置的数字。移除标志其实就是数字传 0。

不依赖三方库,我自己实现了下,像这样:

1
2
3
4
5
6
Intent launchIntent = getApplicationContext().getPackageManager().getLaunchIntentForPackage(getApplicationContext().getPackageName());
Bundle localBundle = new Bundle();
localBundle.putString("package", getApplicationContext().getPackageName());
localBundle.putString("class", launchIntent.getComponent().getClassName());
localBundle.putInt("badgenumber", 1);
getApplicationContext().getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, localBundle);

运行了下,妥妥的。

烦在哪里呢,安卓严重的碎片化。不同牌子的实现方式就都不一样了,上面只是华为的。

有的手机,例如锤子之类的,只有 System App 才能改。

ShortcutBadger 就是对市场上的绝大多数品牌的手机做了适配。一般手机的实现方式都和上面华为那个差不多,传参数调接口就行了。具体可以看这里