應用角標是iOS的一個特色,原生Android並不支持。或許是因為當時iOS的通知欄比較雞肋(當然現在已經改進了很多),而Android的通知欄功能強大?所以才出現了一方依賴於數字角標,一方堅持強大的通知欄,在日常使用中這兩種交互方式都各有特色,沒什么違和感。但是啊,總有人想搞些大新聞:
當收到推送而應用沒有未讀角標時:
安卓---什么爛手機!安卓就是不行!
蘋果---我靠,這應用竟然連角標都不支持!刪掉。
所以啊,眾多手機廠商的定制系統或者Launcher都效仿iOS自定義了該功能。如果嫌適配麻煩,可以看看Github上的兩個項目:
https://github.com/leolin310148/ShortcutBadger
https://github.com/xuyisheng/ShortcutHelper
我嘗試了ShortcutBadger(1.1.13):
使用下來,在華為、三星、小米、索尼、APEX上實測成功。但是發現了兩個問題:
1、有些設備可能會拋出異常,導致設置失敗。實測在Samsung Galaxy Note3(Android5.0)上就是如此,發現異常是在這里拋出的
這里顯示角標是通過發送廣播實現,而canResolveBroadcast方法是檢查是否存在該廣播對應的接收器,不知為何有些設備會找不到。
所以我down了一份代碼,直接改了canResolveBroadcast方法,然后手動把aar包導入到項目中使用了
2、小米比較特別,他的角標數量直接由通知欄數量決定。用以上方法處理時,通知欄會同時出現一條空的通知。所以小米的角標我做了單獨處理
在收到推送消息創建通知時,通過反射把角標數量設置進通知中,這也是官方文檔中的做法。
值得注意的一點是,如果你的通知有好幾類,比如:有郵件的、有新動態的等,郵件的通知是一封郵件對應一個通知,而新動態是折疊在一起的(你有xx條新動態未讀),甚至還有其他不是透傳形式的推送通知的。我原以為在設置角標的時候要手動計算出當前所有通知的數量,但經過驗證,我們只需要關心當前收到的這條消息,如果是折疊的就要用上述方法手動設置數量,其他的並不需要處理,一條通知對應的角標數量默認就是一,同時MIUI會自動計算通知數的總和去更新角標。
3、在榮耀9上調試demo,發現一直無效,提示權限問題,但是權限是的確申請了的。
無意發現申請了 <uses-permission android:name="android.permission.INTERNET" /> 之后就解決了。
最后,如果你是針對某個系統或Launcher單獨寫時,可以直接搜索各家的適配方法,但不管是哪種。。千萬別忘了在AndroidManifest中有沒有添加相應的Badge權限啊~