Android角標(biāo)的顯示

簡(jiǎn)介

今天有一個(gè)需求就是把某一個(gè)列表數(shù)量給顯示到桌面應(yīng)用的角標(biāo)上,然后我登錄到了友盟上,看了下最近應(yīng)用的訪問(wèn)量和機(jī)型Top10,返現(xiàn)vivo,oppo占比超過(guò)了60%,其余都是小米和華為還有其他的。心想把這四大機(jī)型適配上不就可以交差了嘛!

其實(shí)角標(biāo)這個(gè)東西最開始是出現(xiàn)在IOS系統(tǒng)上的,剛開始是為了彌補(bǔ)IOS通知欄上的缺陷才出現(xiàn)這個(gè)玩意,現(xiàn)在IOS的通知欄已經(jīng)很好了。而Android原生根本就沒有提供設(shè)置這個(gè)角標(biāo)的API,而國(guó)內(nèi)的各大廠商拿到ASOP源碼root的時(shí)候,都實(shí)現(xiàn)了該功能。

所以接下來(lái)就去各大官網(wǎng)和Google上查找解決辦法。

實(shí)現(xiàn)方式

今天我們看到的實(shí)現(xiàn)顯示角標(biāo)都是各大廠商自定義一套launcher,然后提供接口供應(yīng)用調(diào)用,完成這個(gè)功能。

華為

在這幾個(gè)機(jī)型調(diào)研的時(shí)候我都是直接去官網(wǎng)查找解決辦法的,華為我直接到官網(wǎng)一下看了下,找到了關(guān)于角標(biāo)適配的文檔
http://obs.cn-north-1.myhwclouds.com/consumer/docattachment/87918b190abda6d7b7a568a7ef1dfc314cd9ad040faccf1a999dcff158ec7d79/badge.pdf

  • 這里貼下適配華為角標(biāo)的步驟
1. 聲明權(quán)限,如下:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission
android:name="com.huawei.android.launcher.permission.CHANGE_BADGE "/>

2. 在需要進(jìn)行角標(biāo)顯示地方,采用如下方法傳遞數(shù)據(jù)給華為桌面應(yīng)用
Bundle extra =new Bundle();
extra.putString("package", "xxxxxx");
extra.putString("class", "yyyyyyy");
extra.putInt("badgenumber", i);
context.getContentResolver().call(Uri.parse("content://com.huawei.andro
id.launcher.settings/badge/"), "change_badge", null, extra);

package:應(yīng)用包名
class:桌面圖標(biāo)對(duì)應(yīng)的應(yīng)用入口Activity類 
badgenumber:角標(biāo)數(shù)字
  • 經(jīng)過(guò)測(cè)試,手頭上的華為手機(jī)在設(shè)置成功后,退出應(yīng)用后,都能在圖標(biāo)上顯示出角標(biāo)數(shù)字,好華為的適配還挺算順暢
VIVO
  • VIVO手機(jī)就沒有那么順暢了,官網(wǎng)上沒有找到適配角標(biāo)的,然后一頓操作,發(fā)現(xiàn)了如下這段代碼
Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
intent.putExtra("packageName", getReactApplicationContext().getPackageName());
String launchClassName = getReactApplicationContext().getPackageManager().getLaunchIntentForPackage(getReactApplicationContext().getPackageName()).getComponent().getClassName();
intent.putExtra("className", launchClassName);
intent.putExtra("notificationNum", count);
getReactApplicationContext().sendBroadcast(intent);

本著試著的態(tài)度就去測(cè)了下,確實(shí)角標(biāo)沒有顯示出來(lái),然后發(fā)現(xiàn)微信和QQ怎么就有呢?其實(shí)有的時(shí)候你能轉(zhuǎn)這個(gè)牛角尖,誰(shuí)叫他們是大廠呢!在網(wǎng)上看到有人把QQ的源碼給反編譯了,找到了適配VIVO角標(biāo)的代碼了

QQ適配VIVO角標(biāo).jpg
  • 接著聯(lián)系了下VIVO官方客服,說(shuō)的意思就是針對(duì)定向的應(yīng)用開啟這個(gè)功能,所以上面的代碼確實(shí)是VIVO適配角標(biāo)的代碼,但是是針對(duì)定向應(yīng)用才好使的。
OPPO
  • OPPO同樣沒有在官網(wǎng)找到適配的代碼,然后一頓操作找到了如下代碼說(shuō)是適配OPPO手機(jī)角標(biāo)的。
 try {
                if (count == 0) {
                    count = -1;
                }
                Intent intent = new Intent("com.oppo.unsettledevent");
                intent.putExtra("pakeageName", getReactApplicationContext().getPackageName());
                intent.putExtra("number", count);
                intent.putExtra("upgradeNumber", count);
                if (canResolveBroadcast(getReactApplicationContext(), intent)) {
                    getReactApplicationContext().sendBroadcast(intent);
                } else {
                    try {
                        Bundle extras = new Bundle();
                        extras.putInt("app_badge_count", count);
                        getReactApplicationContext().getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, extras);
                    } catch (Throwable t) {
                        t.printStackTrace();
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

也是本著試一試的心態(tài)找到幾個(gè)Oppo手機(jī)試了下,嗯,沒有顯示出來(lái),同樣聯(lián)系了下Oppo客服,客服說(shuō)的意思是,可以的,但是的申請(qǐng),申請(qǐng)的內(nèi)容中有關(guān)于你這個(gè)應(yīng)用一個(gè)月的流量數(shù)據(jù)統(tǒng)計(jì),其實(shí)意思就是你流量不到時(shí)可能給你審核通過(guò)的,所以O(shè)ppo又沒戲了。其實(shí)我觀察了下OPPO,像微信和釘釘這兩個(gè)給開通,我發(fā)現(xiàn)京東都沒有,其實(shí)Oppo就是針對(duì)IM類的應(yīng)用才會(huì)給這方面的權(quán)限的。

小米
  • 小米的適配代碼有官網(wǎng)的文檔介紹
    https://dev.mi.com/console/doc/detail?pId=939

  • 小米這個(gè)比較特殊,是通過(guò)統(tǒng)計(jì)通知欄數(shù)量來(lái)設(shè)置角標(biāo)數(shù)的 。

結(jié)語(yǔ)

其實(shí)Android本身的出發(fā)點(diǎn)是通過(guò)強(qiáng)大的通知欄和用戶交互,壓根就沒想過(guò)設(shè)置角標(biāo)啥,也沒提供相應(yīng)的API調(diào)用,實(shí)現(xiàn)也都是各大廠家提供的方案!Android碎片化太嚴(yán)重了,廠商也很多,期望Android后面能出統(tǒng)一這種碎片化的方案,讓我們少踩點(diǎn)坑,說(shuō)實(shí)話IOS那邊的大哥就是一個(gè)API調(diào)用的事情,到我們Android這邊可能一下午都不定能搞定!坑太多了!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容