一些應(yīng)用,尤其是IM應(yīng)用,在很多場景系統(tǒng)會推送未讀消息;這個時候除了通知欄的提醒,還可以在應(yīng)用圖標(biāo)右上角加入角標(biāo)的提示。
目前大部分的安卓系統(tǒng)并不支持設(shè)置應(yīng)用角標(biāo),僅部分定制的系統(tǒng)支持。為了節(jié)省開發(fā)成本,可使用github的開源庫https://github.com/leolin310148/ShortcutBadger 。ShortcutBadger支持的手機類型如下:

具體使用方法參考github文檔,主要的語句如下:
1. Add mavenCentral to your build script.
repositories {
mavenCentral()
}
2. Add dependencies for ShortcutBadger, it's available from maven now.
dependencies {
compile "me.leolin:ShortcutBadger:1.1.16@aar"
}
3. Add the codes below:
int badgeCount = 1;
ShortcutBadger.applyCount(context, badgeCount); //for 1.1.4+
ShortcutBadger.with(getApplicationContext()).count(badgeCount); //for 1.1.3
4. If you want to remove the badge
ShortcutBadger.removeCount(context); //for 1.1.4+
ShortcutBadger.with(getApplicationContext()).remove(); //for 1.1.3
or
ShortcutBadger.applyCount(context, 0); //for 1.1.4+
ShortcutBadger.with(getApplicationContext()).count(0); //for 1.1.3
MIUI系統(tǒng)的調(diào)用方法
ShortcutBadger庫中,對于小米手機(MIUI6及以上)不能采用上述的方法設(shè)置角標(biāo),需要采用以下方案:
//注意,需要在調(diào)用NotificationManger.notify方法之前,調(diào)用更新角標(biāo)的方法
ShortcutBadger.applyNotification(getApplicationContext(), notification, badgeCount);
MIUI系統(tǒng)角標(biāo)原理
MIUI6以后重新設(shè)計了桌面app角標(biāo)的顯示,分為以下兩種情況:
1)默認情況
當(dāng)app 向通知欄發(fā)送了一條通知 (通知不帶進度條并且用戶可以刪除的),那么桌面app icon角標(biāo)就會顯示1. 此時app顯示的角標(biāo)數(shù)是和通知欄里app發(fā)送的通知對應(yīng)的,即向通知欄發(fā)送了多少通知就會顯示多少角標(biāo)。
eg:如下圖,通知欄有兩條通知消息,則app角標(biāo)顯示為2。如果將第一條通知滑動刪除,則app角標(biāo)顯為2-1=1;

備注:不同的通知notifyId不同
2)通知自定義角標(biāo)
小米提供了一種方法供用戶自定義角標(biāo)數(shù)目。如上面的示例,通知欄里雖然只有兩條通知,但第一條通知的角標(biāo)(messageCount)可設(shè)為21,第二條通知的角標(biāo)可設(shè)為3,這樣app的角標(biāo)則為21+3=24條。如果用戶手動刪除第一條通知,則app角標(biāo)顯示變?yōu)?4-21=3條。

原理是通過反射拿到 Notification 的私有屬性 extraNotification ,重點就是這個 extraNotification ,這個類里面有個私有屬性 messageCount ,我們只要改變這個 messageCount 值就能改變app的角標(biāo)。注意,這個值設(shè)置為該條通知對應(yīng)的未讀信息個數(shù),對上圖的第一條通知而言,該值就是21。
反射的具體代碼如下:
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);
具體參考小米官網(wǎng)文檔:https://dev.mi.com/doc/p=3904/