動(dòng)態(tài)修改應(yīng)用icon和name

前言

??電商項(xiàng)目遇到節(jié)日三娩,如果內(nèi)容上沒(méi)有變更,只是需要更換應(yīng)用icon和名稱(chēng)順應(yīng)節(jié)日抑钟。不可能去發(fā)一個(gè)版本涯曲,成本太高,所以可以動(dòng)態(tài)的去修改應(yīng)用的icon和name在塔;

思想

??應(yīng)用集成推送幻件,當(dāng)節(jié)日的時(shí)候收到推送,在后臺(tái)默默的修改掉icon和名稱(chēng)蛔溃,使用activity-alias來(lái)配置绰沥。

activity-alias語(yǔ)法及聲明

<activity-alias android:enabled=["true" | "false"] 
                android:exported=["true" | "false"] 
                android:icon="drawable resource"
                android:label="string resource"
                android:name="string"
                android:permission="string"
                android:targetActivity="string" >
    . . .
</activity-alias>
1. android:enable 該屬性用來(lái)決定目標(biāo)Activity可否通過(guò)別名被系統(tǒng)實(shí)例化,默認(rèn)為true贺待;需要注意的是application也有enable屬性徽曲,只用當(dāng)它們同時(shí)為true時(shí),activity-alias的enable才生效狠持。
2. android:exported 該屬性為true的話疟位,則目標(biāo)Activity可被其他應(yīng)用調(diào)起,如為false則只能被應(yīng)用自身調(diào)起喘垂;其默認(rèn)值根據(jù)activity-alias是否包含intent-filter元素決定甜刻,如果有的話,則默認(rèn)為true正勒,沒(méi)有的話則為false得院;其實(shí)也很好理解,如果有intent-filter章贞,則目標(biāo)Activity可以匹配隱式Intent祥绞,因此可被外部應(yīng)用喚起;如果沒(méi)有intent-filter,則目標(biāo)Activity要被調(diào)起的話必須知道其精確類(lèi)名蜕径,因?yàn)橹挥袘?yīng)用本身才知道精確類(lèi)名两踏,所以此時(shí)默認(rèn)為false。
3. android:icon 該屬性就比較好玩了兜喻,允許自定義icon梦染,可以不同于應(yīng)用本身在桌面的icon;如果需要在桌面上創(chuàng)建快捷入口朴皆,也許產(chǎn)品會(huì)要求換個(gè)不同的icon帕识。
4. android:label 該屬性類(lèi)似于android:icon,圖標(biāo)都換了遂铡,換個(gè)名稱(chēng)也合情合理吧肮疗,此屬性就是為此而生的。
5. android:name 該屬性可以為任意字符串扒接,但最好符合類(lèi)名命名規(guī)范伪货;activity元素的name屬性實(shí)質(zhì)上都會(huì)指向一個(gè)具體的Activity類(lèi),而activity-alias的name屬性?xún)H作為一個(gè)唯一標(biāo)識(shí)而已钾怔。
6. android:permission 該屬性指明了通過(guò)別名聲明調(diào)起目標(biāo)Activity所必需的權(quán)限超歌。
7. android:targetActivity 該屬性指定了目標(biāo)Activity,即通過(guò)activity-alias調(diào)起的Activity是哪個(gè)蒂教,此屬性其實(shí)類(lèi)似于activity標(biāo)簽中的name屬性,需要規(guī)范的Activity包名類(lèi)名脆荷。

activity-alias用法示例

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity-alias
            android:name="com.example.zcj.dynamicondemo.MainActivityAlias1"
            android:enabled="false"
            android:icon="@mipmap/ic_launcher"
            android:label="aaa"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias
            android:name="com.example.zcj.dynamicondemo.MainActivityAlias2"
            android:enabled="false"
            android:label="bbb"
            android:icon="@mipmap/ic_launcher_round"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>
    </application>

動(dòng)態(tài)設(shè)置顯示哪個(gè)

  private static final String ACTIVITY_ALIAS = "com.example.zcj.dynamicondemo.MainActivity";
  private static final String ACTIVITY_ALIAS_1 = "com.example.zcj.dynamicondemo.MainActivityAlias1";
  private static final String ACTIVITY_ALIAS_2 = "com.example.zcj.dynamicondemo.MainActivityAlias2";
  private void setIcon(String activity_alias) {
        Context ctx = getApplication();
        PackageManager pm = ctx.getPackageManager();
        pm.setComponentEnabledSetting(
                new ComponentName(ctx, ACTIVITY_ALIAS),
                ACTIVITY_ALIAS.equals(activity_alias) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

        pm.setComponentEnabledSetting(
                new ComponentName(ctx, ACTIVITY_ALIAS_1),
                ACTIVITY_ALIAS_1.equals(activity_alias) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

        pm.setComponentEnabledSetting(
                new ComponentName(ctx, ACTIVITY_ALIAS_2),
                ACTIVITY_ALIAS_2.equals(activity_alias) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

        Toast.makeText(this, activity_alias, Toast.LENGTH_LONG).show();
        //干掉桌面app凝垛,讓它自動(dòng)重啟。
        ActivityManager am = (ActivityManager) ctx.getSystemService(Activity.ACTIVITY_SERVICE);
        Intent i = new Intent(Intent.ACTION_MAIN);
        i.addCategory(Intent.CATEGORY_HOME);
        i.addCategory(Intent.CATEGORY_DEFAULT);
        List<ResolveInfo> resolves = pm.queryIntentActivities(i, 0);
        for (ResolveInfo res : resolves) {
            if (res.activityInfo != null) {
                am.killBackgroundProcesses(res.activityInfo.packageName);
            }
        }

    }

PackageManager.COMPONENT_ENABLED_STATE_ENABLED 顯示
PackageManager.COMPONENT_ENABLED_STATE_DISABLED 隱藏

DEMO:https://gitee.com/zcj0615/dynamicondemo.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜓谋,一起剝皮案震驚了整個(gè)濱河市梦皮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桃焕,老刑警劉巖剑肯,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異观堂,居然都是意外死亡让网,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)师痕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溃睹,“玉大人,你說(shuō)我怎么就攤上這事胰坟∫蚱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)竞滓。 經(jīng)常有香客問(wèn)我咐吼,道長(zhǎng),這世上最難降的妖魔是什么商佑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任锯茄,我火速辦了婚禮,結(jié)果婚禮上莉御,老公的妹妹穿的比我還像新娘撇吞。我一直安慰自己,他們只是感情好礁叔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布牍颈。 她就那樣靜靜地躺著,像睡著了一般琅关。 火紅的嫁衣襯著肌膚如雪煮岁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天涣易,我揣著相機(jī)與錄音画机,去河邊找鬼。 笑死新症,一個(gè)胖子當(dāng)著我的面吹牛步氏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徒爹,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼荚醒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了隆嗅?” 一聲冷哼從身側(cè)響起界阁,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胖喳,沒(méi)想到半個(gè)月后泡躯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丽焊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年较剃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片技健。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡重付,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凫乖,到底是詐尸還是另有隱情确垫,我是刑警寧澤弓颈,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站删掀,受9級(jí)特大地震影響翔冀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜披泪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一纤子、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧款票,春花似錦控硼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缚够,卻和暖如春幔妨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谍椅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工误堡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雏吭。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓锁施,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親杖们。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沾谜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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