Android App動(dòng)態(tài)顯示多個(gè)入口

經(jīng)常看到有App提供多個(gè)入口,就是桌面上顯示有多種圖標(biāo),點(diǎn)不同圖標(biāo)進(jìn)入不同的功能頁(yè)。
基本實(shí)現(xiàn)很簡(jiǎn)單,以下是步驟。

1. AndroidManifest.xml里注冊(cè)別名。

<application>里添加<activity-alias>

        <activity-alias
            android:name=".test"
            android:enabled="false"
            android:icon="@drawable/applogo"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:clearTaskOnLaunch="true"
            android:targetActivity=".splashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>

run一下你就會(huì)發(fā)現(xiàn)桌面存在兩個(gè)app的圖標(biāo)了,也就是存在兩個(gè)入口了。

說(shuō)明一下:
android:name參數(shù)就是這個(gè)入口的名稱。
android:enabled打開(kāi)和關(guān)閉的參數(shù)。
android:icon入口顯示的圖標(biāo),這樣就可以給不同的入口設(shè)置不同的圖標(biāo)了。
android:label就是桌面上顯示的名稱。
android:targetActivity是重點(diǎn),就是你點(diǎn)擊了不同的入口會(huì)選擇進(jìn)入的頁(yè)面。通過(guò)這個(gè)就能設(shè)置不同入口的不同功能了。
搞定,So easy!
不要滿足,我們拓展一下。

2.動(dòng)態(tài)更新入口。

剛才我們?cè)O(shè)置了android:name,通過(guò)名稱,我們就可以使用PackageManager對(duì)他進(jìn)行操作了。
假設(shè)我們有個(gè)主要的LAUNCHER。(像這樣我們把名叫splashActivity的頁(yè)面設(shè)置為了LAUNCHER):

<activity
            android:name=".splashActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/FirstTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

以及一個(gè)上面這樣的activity-alias,名字叫test。
我們通過(guò)PackageManagersetComponentEnabledSetting方法就可以關(guān)閉和打開(kāi)入口:

    private ComponentName mDefault = getComponentName();
    private ComponentName mDoubleSpring = new ComponentName(getBaseContext(),"com.boosj.boosjapp.test");
    private PackageManager mPm = getApplicationContext().getPackageManager();

    disableComponent(mDefault);
    enableComponent(mDoubleSpring);
    
    private void enableComponent(ComponentName componentName) {
        mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
    }

    private void disableComponent(ComponentName componentName) {
        mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
    }

這個(gè)例子中就關(guān)閉了主入口,僅僅保留了test入口。執(zhí)行后查看桌面就會(huì)發(fā)現(xiàn)只剩下test的入口圖標(biāo)了。

當(dāng)然,也可以給他加上條件,實(shí)現(xiàn)動(dòng)態(tài)自動(dòng)更新。

    private ComponentName mDefault = getComponentName();
    private ComponentName mDoubleSpring = new ComponentName(getBaseContext(),"com.boosj.boosjapp.test");
    private PackageManager mPm = getApplicationContext().getPackageManager();

        /**
         * 計(jì)算是否在日期范圍內(nèi)
         */
        try {
            Date date = new Date();
            Log.d("LOGCAT",mathFactory.Date2ms("2018-03-01 00:00:00")+"_"+date.getTime());
            if (mathFactory.Date2ms("2018-03-01 00:00:00")>date.getTime()) {
                disableComponent(mDefault);
                enableComponent(mDoubleSpring);
            }else {
                enableComponent(mDefault);
                disableComponent(mDoubleSpring);
            }
        }catch (Exception e){
            enableComponent(mDefault);
            disableComponent(mDoubleSpring);
        }

    private void enableComponent(ComponentName componentName) {
        mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
    }

    private void disableComponent(ComponentName componentName) {
        mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
    }

這個(gè)例子中,實(shí)現(xiàn)了2018.3.1日前桌面會(huì)顯示activity-alias的圖標(biāo),而原來(lái)的主要圖標(biāo)被隱藏了。等到2018.3.1過(guò)完,圖標(biāo)又回復(fù)原樣。

3.一個(gè)小問(wèn)題。

這個(gè)方法有個(gè)問(wèn)題,就是在主LAUNCHERdisable期間,如果要更新App,安裝完畢并啟動(dòng)時(shí)就會(huì)報(bào)找不到LAUNCHER文件的錯(cuò)誤而使App崩潰。而不讓更新或者讓先卸載再重新安裝顯然是很智障的。所以那種只顯示一個(gè)圖標(biāo),按條件動(dòng)態(tài)更新的需求,用此方法是恐怕不能做到了。
(或者有什么更好的主意,歡迎探討。)


這個(gè)方法其實(shí)本來(lái)是想做App圖標(biāo)的動(dòng)態(tài)更新的。(然而最終失敗了,具體原因就是上面說(shuō)的崩潰問(wèn)題。)
還是把他作為多入口的方法記錄一下吧。

最后編輯于
?著作權(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ù)。

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