Android 利用 <activity-alias> 動(dòng)態(tài)改變 App 桌面圖標(biāo)

參考文章:Dovar-66的博客

<activity-alias>介紹:

大家知道,對(duì)于 Activity 組件,使用時(shí)需要在 Manifest 文件中通過(guò) 標(biāo)簽注冊(cè) name、theme、intent-filter 等相關(guān)屬性信息,然后通過(guò) Intent 操作便可以啟動(dòng)對(duì)應(yīng) Activity。殊不知,我們還能通過(guò) <activity-alias> 標(biāo)簽為每個(gè) Activity 注冊(cè)一個(gè)“別名”,通過(guò)這個(gè)別名也能啟動(dòng)對(duì)應(yīng)的目標(biāo) Activity。我們來(lái)看一下這個(gè)“別名”能夠設(shè)置哪些屬性:

 <activity android:name="com.sunnews.dodo.SplashActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <activity-alias
            android:name="com.sunnews.dodo.SplashAliasActivity"
            android:targetActivity="com.sunnews.dodo.SplashActivity"
            android:label="新消息!Do"
            android:icon="@mipmap/ic_launcher"
            android:enabled="false">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        </activity-alias>

可以看出,大部分屬性與 <Activity>
標(biāo)簽的屬性一致,簡(jiǎn)單分析一下:
android:enabled 屬性,布爾類(lèi)型,是否開(kāi)啟別名設(shè)置,默認(rèn)值為 true;
android:exported 屬性,布爾類(lèi)型,是否支持其他應(yīng)用通過(guò)這個(gè)別名訪(fǎng)問(wèn)目標(biāo) Activity,默認(rèn)值為 true;
android:icon 和 label 屬性:類(lèi)似 <activity>
標(biāo)簽,表示目標(biāo) Activity 的顯示圖標(biāo)和標(biāo)簽;
android:name 屬性:Activity 別名,在 <activity>
標(biāo)簽中, name 屬性必須與對(duì)應(yīng) Activity 文件的名字保持一致,而這里的別名可任意設(shè)置,保證唯一性即可;
android:permission 屬性:權(quán)限設(shè)置,對(duì)別名的使用加以限制,詳細(xì)屬性值參考開(kāi)發(fā)者官網(wǎng)對(duì) 權(quán)限部分 的說(shuō)明;
android:targetActivity 屬性:指定別名能夠啟動(dòng)的目標(biāo) Activity,注意,屬性值一定要對(duì)應(yīng)到 <activity>
標(biāo)簽中的 name 屬性,并且該 <activity>
標(biāo)簽一定要位于 <activity-alias>
標(biāo)簽前面;
注意看,在別名設(shè)置中添加了 <intent-filter> 標(biāo)簽,與 targetActivity 的設(shè)置一致:
android.intent.action.MAIN 表示這個(gè)別名設(shè)置是整個(gè)應(yīng)用的入口,應(yīng)用啟動(dòng)時(shí)第一個(gè)創(chuàng)建的就是這個(gè) Activity;
android.intent.category.LAUNCHER 表示這個(gè)別名設(shè)置將出現(xiàn)在桌面 Launcher 應(yīng)用上;
至于其他屬性,<activity> 標(biāo)簽中也有相應(yīng)設(shè)置,只是通常我們?cè)?<application> 標(biāo)簽中統(tǒng)一設(shè)置而已,然后<activity> 標(biāo)簽?zāi)J(rèn)繼承<application> 標(biāo)簽中的設(shè)置。上述代碼還有一點(diǎn)需要注意的是,android:enabled 屬性設(shè)為 false,否則運(yùn)行時(shí)將會(huì)在桌面上出現(xiàn)兩個(gè)相同功能但不同顯示的應(yīng)用圖標(biāo)和名稱(chēng)。

動(dòng)態(tài)改變App桌面圖標(biāo):

變換圖標(biāo)

 PackageManager pm = MyApplication.appContext.getPackageManager();
        pm.setComponentEnabledSetting(new ComponentName(MyApplication.appContext, "com.sunnews.dodo.SplashActivity"),
               PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
        pm.setComponentEnabledSetting(new ComponentName(MyApplication.appContext, "com.sunnews.dodo.SplashAliasActivity"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

換回圖標(biāo)

 PackageManager pm = MyApplication.appContext.getPackageManager();
        pm.setComponentEnabledSetting(new ComponentName(MyApplication.appContext, "com.sunnews.dodo.SplashAliasActivity"),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
        pm.setComponentEnabledSetting(new ComponentName(MyApplication.appContext, "com.sunnews.dodo.SplashActivity"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

效果圖:

GIF.gif
最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,761評(píng)論 25 709
  • Application 標(biāo)簽 android:allowTaskReparenting android:allow...
    Shawn_Dut閱讀 8,180評(píng)論 2 61
  • 早起,可以說(shuō)是通宵沒(méi)睡了,連著兩天這樣了,傷不起 記賬完成 運(yùn)動(dòng),下雨了 晚安啦
    饞小周閱讀 177評(píng)論 1 1
  • 寸心暫任還新畫(huà),尺素頻申借舊書(shū)。 梅雨霏霏來(lái)已久,夏雷陣陣悔當(dāng)初。 【行者點(diǎn)評(píng)】 這首詩(shī)無(wú)題,其實(shí)寫(xiě)的是相思,我建...
    林香砌閱讀 239評(píng)論 0 7
  • 冬季釣什么魚(yú)? 一般家養(yǎng)魚(yú)如青魚(yú)、草魚(yú)、鳊魚(yú)等在氣溫15度以下時(shí)食欲減退,8度以下則靜臥深水中,進(jìn)入半冬眠狀態(tài),很...
    Dee_Yu閱讀 293評(píng)論 0 0

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