安卓應用角標那些事兒

什么是應用角標弃榨?

應用角標最開始是在ios系統(tǒng)中出現(xiàn)的藤乙,大概長這樣:

角標.jpg

不知道從什么時候開始,國內各大安卓手機系統(tǒng)上惭墓,也慢慢出現(xiàn)了應用角標的身影,到現(xiàn)在幾乎成為了安卓系統(tǒng)的標配而姐,發(fā)張圖片讓大家近距離感受一下:
screenshot.png

但是有一點要特別提一下腊凶,那就是原生的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)適配的煩惱:

角標02.png

但在實際使用時综膀,你會發(fā)現(xiàn)澳迫,圖片很美,現(xiàn)實卻很殘酷剧劝!經不完全測試(原諒我的“不完全”橄登,畢竟安卓機型碎片化太過嚴重),我發(fā)現(xiàn)這個開源庫對于小米讥此、華為拢锹、vivo和oppo等主流機型的支持都是有各種問題的,要么完全不奏效萄喳,要么就有bug卒稳。當然這個開源庫也在不斷完善,但是在它還不夠穩(wěn)定的情況下他巨,建議大家還是先用來當備選方案充坑,支持一些冷門機型可以,主流機型還是自己適配比較靠譜點染突。

特殊機型適配

華為系列

傳送門:華為角標官方文檔
按照華為官方文檔的介紹捻爷,如果要獲得應用角標支持,需要為應用申請華為證書份企,然后在“權簽平臺”下載開發(fā)者證書也榄,再將開發(fā)者證書集成到應用中,整個流程跑下來還是很繁瑣的司志。
那么吃瓜群眾肯定就要問了甜紫,有沒有簡單一點的方法呢?答案當然是有的骂远!結合華為的《角標開發(fā)指導書》中的代碼參考和親身實踐棵介,我發(fā)現(xiàn)只需要其中兩步,也可以實現(xiàn)華為角標支持(目前只驗證了華為mate8 和華為 p7吧史,其他機型手頭暫時沒有邮辽,歡迎大家補充):

  1. 在AndroidManifest.xml中申請華為角標權限
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
  1. 參考以下代碼唠雕,設置應用角標即可
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/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末穷躁,一起剝皮案震驚了整個濱河市耕肩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌问潭,老刑警劉巖猿诸,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狡忙,居然都是意外死亡梳虽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門灾茁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窜觉,“玉大人,你說我怎么就攤上這事北专≠鞔欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵拓颓,是天一觀的道長语婴。 經常有香客問我,道長驶睦,這世上最難降的妖魔是什么砰左? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮场航,結果婚禮上缠导,老公的妹妹穿的比我還像新娘。我一直安慰自己溉痢,他們只是感情好僻造,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布憋他。 她就那樣靜靜地躺著,像睡著了一般嫡意。 火紅的嫁衣襯著肌膚如雪举瑰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天蔬螟,我揣著相機與錄音此迅,去河邊找鬼。 笑死旧巾,一個胖子當著我的面吹牛耸序,可吹牛的內容都是我干的。 我是一名探鬼主播鲁猩,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼坎怪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了廓握?” 一聲冷哼從身側響起搅窿,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隙券,沒想到半個月后男应,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡娱仔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年沐飘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牲迫。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡耐朴,死狀恐怖,靈堂內的尸體忽然破棺而出盹憎,到底是詐尸還是另有隱情筛峭,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布陪每,位于F島的核電站影晓,受9級特大地震影響,放射性物質發(fā)生泄漏奶稠。R本人自食惡果不足惜俯艰,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一捡遍、第九天 我趴在偏房一處隱蔽的房頂上張望锌订。 院中可真熱鬧,春花似錦画株、人聲如沸辆飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜈项。三九已至芹关,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間紧卒,已是汗流浹背侥衬。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跑芳,地道東北人轴总。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像博个,于是被迫代替她去往敵國和親怀樟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評論 25 707
  • 作者:小強 貝聊移動開發(fā)部 Android工程師 前言:本文主要講述了以下三方面:怎么在Android系統(tǒng)下讓自家...
    貝聊科技閱讀 17,334評論 33 78
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盆佣,服務發(fā)現(xiàn)往堡,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 飛樂鳥的畫畫書共耍,美美噠虑灰,好吃還可以學畫畫。這本主要以甜點為主征堪。是女孩子舍棄不掉的關于甜點的美夢瘩缆。 這一本是美食系列...
    桃子的小站閱讀 853評論 0 7
  • 姐家的老大已到了談婚論嫁的年紀。外甥高大帥氣佃蚜,又有手藝庸娱。很快有人給介紹了附近村里的一個姑娘,見面之初谐算,兩人都...
    雅靈看世界閱讀 261評論 0 0