經(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ò)PackageManager
的setComponentEnabledSetting
方法就可以關(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)題边涕,就是在主LAUNCHER
disable期間晤碘,如果要更新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)題美浦。)
還是把他作為多入口的方法記錄一下吧弦赖。