在小米饥努、三星等系統(tǒng)應(yīng)用圖標(biāo)上顯示badge

開始

大家經(jīng)常看見在小米或者三星系統(tǒng)上八回,應(yīng)用會把應(yīng)用的消息數(shù)量想蘋果手機(jī)一樣顯示在右上角酷愧,其實(shí)這種消息提示的方法在原生Android上是不支持的,原生的launcher在圖標(biāo)上沒有顯示徽標(biāo)的view缠诅。

但是小米溶浴、三星、華為管引、聯(lián)想士败、索尼等手機(jī)廠商都沒有使用原生的launcher,他們使用的桌面都是自己重寫的褥伴。所以他們都已經(jīng)實(shí)現(xiàn)了在桌面圖標(biāo)上顯示消息數(shù)量徽標(biāo)的方法谅将,我們只要進(jìn)行調(diào)用就行了。

先上圖(設(shè)備有限重慢,只有小米和三星):

三星手機(jī)上的效果

小米手機(jī)上的效果

小米實(shí)現(xiàn)的源碼:

/**
     * 在小米手機(jī)上顯示桌面徽標(biāo)
     *
     * @param context
     * @param num
     */
    private static void xiaoMiShortCut(Context context, int num) {
        boolean isMiUIV6 = true;
        try {
            Class miuiNotificationClass = Class.forName("android.app.MiuiNotification");
            Object miuiNotification = miuiNotificationClass.newInstance();
            Field field = miuiNotification.getClass().getDeclaredField("messageCount");
            field.setAccessible(true);
            field.set(miuiNotification, num);// 設(shè)置信息數(shù)
            field = notification.getClass().getField("extraNotification");
            field.setAccessible(true);
            field.set(notification, miuiNotification);
        } catch (Exception e) {
            e.printStackTrace();
            //miui 6之前的版本
            isMiUIV6 = false;
            Intent localIntent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");
            localIntent.putExtra("android.intent.extra.update_application_component_name", context.getPackageName() + "/.login.WelcomeActivity");
            localIntent.putExtra("android.intent.extra.update_application_message_text", num);
            context.sendBroadcast(localIntent);
        } finally {
            if (notification != null && isMiUIV6) {
                //miui6以上版本需要使用通知發(fā)送
                nm.notify(10201, notification);
            }
        }
    }

三星上實(shí)現(xiàn)的源碼:

/**
     * 在三星手機(jī)上顯示桌面徽標(biāo)
     *
     * @param context 上下文
     * @param num 顯示的消息數(shù)量饥臂,整數(shù)
     */
    private static void samsungShortCut(Context context, int num) {
        String launcherClassName = getLaunchActivityName(context);
        if (launcherClassName == null) {
            return;
        }
        Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
        intent.putExtra("badge_count", num);
        intent.putExtra("badge_count_package_name", context.getPackageName());
        intent.putExtra("badge_count_class_name", launcherClassName);

        context.sendBroadcast(intent);
//        Toast.makeText(context, "三星手機(jī)," + "廣播已經(jīng)發(fā)送", Toast.LENGTH_LONG).show();
    }

關(guān)于MIUI的一點(diǎn)看法

1.大家應(yīng)該已經(jīng)看出,小米在MIUI6以后和三星的實(shí)現(xiàn)方式不一樣了似踱,小米將系統(tǒng)的Notification改寫成了自己的MiuiNotification隅熙,增加了messageCount字段,用于存儲消息數(shù)量核芽,通過反射將消息數(shù)量設(shè)置到了messageCount里囚戚。此處的num一定要是整數(shù)~
2.MIUI6以下,通過發(fā)送廣播即可完成徽標(biāo)設(shè)置~
3.通過上面可以發(fā)現(xiàn)狞洋,MIUI6以上系統(tǒng)弯淘,在顯示桌面徽標(biāo)數(shù)量的時候是通過統(tǒng)計(jì)在系統(tǒng)通知欄中的所有該應(yīng)用的notification的messageCount的總和,如果你清除了那條通知吉懊,那么桌面徽標(biāo)也就跟隨去掉庐橙。
4.我個人覺得這樣的實(shí)現(xiàn)方式比較好假勿,也方便進(jìn)行管理,畢竟顯示的徽標(biāo)也是一種notification态鳖,那么就應(yīng)該和系統(tǒng)通知同步進(jìn)行管理转培。

關(guān)于三星的一點(diǎn)看法

1.在三星的實(shí)現(xiàn)方式上,系統(tǒng)通知和桌面徽標(biāo)數(shù)量是沒有聯(lián)系的浆竭,三星的桌面應(yīng)用是TouchWiz.apk浸须,通過反編譯可以看到,在launcher類中定義了action為“android.intent.action.BADGE_COUNT_UPDATE”的廣播接收者邦泄,
TouchWiz的launcher類

我之前在網(wǎng)上查找到的資料删窒,在設(shè)置消息條數(shù)的時候設(shè)置的都是String類型的,導(dǎo)致我一直不能顯示徽標(biāo)顺囊,人家廣播接收者里面只接受int類型的肌索。。特碳。
2.三星在設(shè)置完徽標(biāo)數(shù)量后诚亚,是將徽標(biāo)數(shù)量持久化了的,也就是如果你需要去掉徽標(biāo)午乓,得重新發(fā)送廣播站宗,將數(shù)量設(shè)置為0即可。個人覺得沒有小米的管理方便~

關(guān)于其他類型手機(jī)的徽標(biāo)設(shè)置

通過反編譯麻花騰的產(chǎn)品看到益愈,他還判斷聯(lián)想梢灭、華為、索尼等產(chǎn)品腕唧,附上一些代碼(下面代碼除華為外或辖,其他沒有進(jìn)行測試#華為的測試結(jié)果是跑不通):

/**
     * 創(chuàng)建索尼桌面徽標(biāo)
     *
     * @param context
     * @param num
     */
    private static void setSonyBadge(Context context, int num) {
        Intent localIntent = new Intent();
        String str1 = getLaunchActivityName(context);
        if (str1 == null)
            return;
        boolean isShow = false;
        if (num < 1) {
            isShow = false;
        } else if (num > 99) {
            isShow = true;
        }
        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", isShow);
        localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", str1);
        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "");
        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());
        context.sendBroadcast(localIntent);

    }
/**
     * 判斷是否是聯(lián)想手機(jī)
     *
     * @param context
     * @param paramString
     * @return
     */
    private static boolean islenovoLanucher(Context context, String paramString) {
        try {
            if (null == packmag)
                packmag = context.getPackageManager();
            float f = Float.valueOf(Float.parseFloat(packmag.getPackageInfo(paramString, 0).versionName.substring(0, 3))).floatValue();
            if (f >= 6.7F)
                return true;
        } catch (Exception localException) {
            return false;
        }

        return false;
    }

華為可以參見華為桌面未讀角標(biāo)

以上內(nèi)容僅個人觀點(diǎn),能力有限枣接,如有不足,歡迎指導(dǎo)缺谴,勿噴~謝謝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末但惶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子湿蛔,更是在濱河造成了極大的恐慌膀曾,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阳啥,死亡現(xiàn)場離奇詭異添谊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)察迟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門斩狱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耳高,“玉大人,你說我怎么就攤上這事所踊∶谇梗” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵秕岛,是天一觀的道長碌燕。 經(jīng)常有香客問我,道長继薛,這世上最難降的妖魔是什么修壕? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮遏考,結(jié)果婚禮上慈鸠,老公的妹妹穿的比我還像新娘。我一直安慰自己诈皿,他們只是感情好林束,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稽亏,像睡著了一般壶冒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上截歉,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天胖腾,我揣著相機(jī)與錄音,去河邊找鬼瘪松。 笑死咸作,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宵睦。 我是一名探鬼主播记罚,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壳嚎!你這毒婦竟也來了桐智?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烟馅,失蹤者是張志新(化名)和其女友劉穎说庭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郑趁,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刊驴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捆憎。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡舅柜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攻礼,到底是詐尸還是另有隱情业踢,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布礁扮,位于F島的核電站知举,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏太伊。R本人自食惡果不足惜雇锡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僚焦。 院中可真熱鬧锰提,春花似錦、人聲如沸芳悲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽名扛。三九已至谅年,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肮韧,已是汗流浹背融蹂。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弄企,地道東北人超燃。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像拘领,于是被迫代替她去往敵國和親意乓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容