什么是應用角標弃榨?
應用角標最開始是在ios系統(tǒng)中出現(xiàn)的藤乙,大概長這樣:
不知道從什么時候開始,國內各大安卓手機系統(tǒng)上惭墓,也慢慢出現(xiàn)了應用角標的身影,到現(xiàn)在幾乎成為了安卓系統(tǒng)的標配而姐,發(fā)張圖片讓大家近距離感受一下:
但是有一點要特別提一下腊凶,那就是
原生的Android系統(tǒng),是不支持應用角標的
(這也是文章標題叫“安卓角標”而不是“Android角標”的原因)拴念。畢竟應用角標是一個帶有爭議的設計钧萍,有些強迫癥用戶對應用角標咬牙切齒,有些用戶看不到應用角標又渾身癢癢政鼠,對于這一點我也只能說“仁者見仁风瘦,智者見智”吧。
如何支持應用角標公般?
安卓應用的角標是由Launcher支持的万搔,而原生的Android系統(tǒng)Launcher并沒有提供角標支持,所以各大手機廠商只能自己定制Launcher來實現(xiàn)官帘,然后提供接口給外部使用瞬雹。主流的做法都是通過廣播Intent的形式來提供接口,不同的手機系統(tǒng)所支持的廣播Intent也不太一樣刽虹,所以需要針對不同的手機系統(tǒng)來做適配(恭喜你又成功跳入一個系統(tǒng)適配的坑P锇啤)。
角標開源庫介紹
相信每個安卓開發(fā)者看到系統(tǒng)適配這幾個字,都不會不由自主噴出一口老血胖缤。尚镰。。但是這次不用慌哪廓,因為已經有不怕死的家伙為我們造好了輪子狗唉,接下來就為大家隆重推出 ShortcutBadger (github大法好啊~真是好~)。這個開源庫為我們封裝了各種系統(tǒng)適配的細節(jié)撩独,如文檔所描述的敞曹,擁有了ShortcutBadger,你也就免除了以下系統(tǒng)適配的煩惱:
但在實際使用時综膀,你會發(fā)現(xiàn)澳迫,圖片很美,現(xiàn)實卻很殘酷剧劝!經不完全測試(原諒我的“不完全”橄登,畢竟安卓機型碎片化太過嚴重),我發(fā)現(xiàn)這個開源庫對于小米讥此、華為拢锹、vivo和oppo等主流機型的支持都是有各種問題的,要么完全不奏效萄喳,要么就有bug卒稳。當然這個開源庫也在不斷完善,但是在它還不夠穩(wěn)定的情況下他巨,建議大家還是先用來當備選方案充坑,支持一些冷門機型可以,主流機型還是自己適配比較靠譜點染突。
特殊機型適配
華為系列
傳送門:華為角標官方文檔
按照華為官方文檔的介紹捻爷,如果要獲得應用角標支持,需要為應用申請華為證書份企,然后在“權簽平臺”下載開發(fā)者證書也榄,再將開發(fā)者證書集成到應用中,整個流程跑下來還是很繁瑣的司志。
那么吃瓜群眾肯定就要問了甜紫,有沒有簡單一點的方法呢?答案當然是有的骂远!結合華為的《角標開發(fā)指導書》中的代碼參考和親身實踐棵介,我發(fā)現(xiàn)只需要其中兩步,也可以實現(xiàn)華為角標支持(目前只驗證了華為mate8 和華為 p7吧史,其他機型手頭暫時沒有邮辽,歡迎大家補充):
- 在AndroidManifest.xml中申請華為角標權限
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
- 參考以下代碼唠雕,設置應用角標即可
Bundle bundle = new Bundle();
bundle.putString("package", context.getPackageName());
String launchClassName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent().getClassName();
bundle.putString("class", launchClassName);
bundle.putInt("badgenumber", msgCount);
context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bundle);
小米系列
傳送門:小米角標官方文檔
在小米機型上,系統(tǒng)默認是支持應用角標的吨述,不過支持的方式非常反人類岩睁,導致經常有用戶來反饋說角標數(shù)字不對的問題。小米官方文檔關于默認情況是這么描述的:
當app向通知欄發(fā)送了一條通知 (通知不帶進度條并且用戶可以刪除的)揣云,那么桌面app icon角標就會顯示1捕儒。此時app顯示的角標數(shù)是和通知欄里app發(fā)送的通知數(shù)對應的,即向通知欄發(fā)送了多少通知就會顯示多少角標邓夕。
那么吃瓜群眾肯定又要問了刘莹,What are you talking about?焚刚!不要慌点弯,我舉一個例子大家就明白了,比如說千趴蠊荆客戶端抢肛,每收到一條未讀的聊天消息,就會往通知欄發(fā)送一條通知(由于業(yè)務需要碳柱,通知id都是同一個)捡絮,假如用戶收到了5條未讀消息,理論上來說千牛的角標數(shù)字應該顯示5莲镣,但是在小米機型上你會驚奇地發(fā)現(xiàn)角標數(shù)字居然是1福稳。這是因為默認情況下,應用的角標數(shù)字跟應用往通知欄發(fā)送的通知數(shù)(注意瑞侮!這個通知數(shù)是根據(jù)通知id來計算的
)相對應的的圆,在剛剛說的場景中,雖然千牛往通知欄發(fā)送了5條通知区岗,但是按照通知id來統(tǒng)計時,對應的通知數(shù)就是1毁枯,所以角標數(shù)字也就顯示成1了
慈缔。
小米官方可能也意識到了,這個奇葩的設計會導致很多用戶產生困惑种玛,所以在官方文檔中也提供了修改角標數(shù)的接口藐鹤。不同于其他手機系統(tǒng)通過廣播來修改角標,小米系統(tǒng)是通過反射機制來修改角標赂韵,關鍵代碼參考如下:
Field field = notification.getClass().getDeclaredField("extraNotification");
Object extraNotification = field.get(notification);
Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);
method.invoke(extraNotification, unreadCount);
OPPO系列
抱歉娱节,沒有發(fā)現(xiàn)官方文檔。
聯(lián)系過oppo的開發(fā)者客服祭示,客服MM表示:
oppo角標提醒目前只針對內部軟件還有微信肄满、QQ開放,其他的暫時無法提供
啊,多么痛的領悟~不過客服MM也及時發(fā)了一張好人卡:
后續(xù)應該會計劃對其他應用開放的稠歉,敬請關注我們的開發(fā)平臺
嗯掰担,雖然被拒絕了,但是希望還是有的怒炸,那就繼續(xù)關注oppo開發(fā)者官網吧~
VIVO系列
抱歉带饱,沒有發(fā)現(xiàn)官方文檔。
不過最近有幸在網上看到一段代碼阅羹,據(jù)說能支持vivo角標展示勺疼,抱著“死馬當作活馬醫(yī)”的心態(tài),我嘗試了一把捏鱼,最后發(fā)現(xiàn)居然奏效了执庐。不多說了,貼代碼共賞之:
Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
intent.putExtra("packageName", context.getPackageName());
String launchClassName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent().getClassName();
intent.putExtra("className", launchClassName);
intent.putExtra("notificationNum", msgCount);
context.sendBroadcast(intent);
Sony系列
參考資料:https://developer.sony.com/2016/06/23/xperia-home-badge-api-now-publicly-available/