如何實(shí)現(xiàn)手機(jī)桌面上兩個圖標(biāo)作為entry point去啟動一個app不同activity
具體步驟如下:
1、新建一個工程(如app),這里android studio默認(rèn)會幫你創(chuàng)建一個mainActivity及其布局文件activity_main.xml。為了方便閱讀,我將MainActivity-->ActivityA,activity_main.xml-->activity_a.xml,將ActivityA中的TextView的內(nèi)容從Hello World! --> Activity_A。
2、然后新建一個ActivityB和布局文件activity_b.xml,并在activity_b.xml文件中創(chuàng)建一個TextView,顯示的內(nèi)容為Activity_B。



3、接下來,是整個demo的核心所在。當(dāng)我們創(chuàng)建一個app的時候,android studio會默認(rèn)幫我們創(chuàng)建出一個MainActivity,并將這個MainActivity設(shè)置成launch(加載) 這個app所默認(rèn)展示的activity。那么要如何設(shè)置一個activity為默認(rèn)展示的activity呢?我們打開項(xiàng)目的AndroidManifest.xml文件,可以發(fā)現(xiàn)默認(rèn)的MainActivity(已經(jīng)被我改成ActivityA)的配置如下:

這里最核心的就是<action android:name="android.intent.action.Main"/>,這個action屬性決定了這個acitivty是main entry point,而<category android:name="android.intent.category.LAUNCHER"/>決定了是否在桌面中顯示出對應(yīng)的icon圖標(biāo)。
注意:
(1)當(dāng)你的app只有一個activity的時候,那么必須為這個acitivity配置這兩個屬性,缺少其中一個都會報(bào)錯。為何?
? ? 因?yàn)楣雀柙O(shè)計(jì)安卓系統(tǒng)就是為了讓更多的用戶用上安卓開發(fā)的app。并且,當(dāng)你的app是擁有acitivity的時候,系統(tǒng)會認(rèn)為你的acitivity就是為了展示給用戶的,不然你的activity毫無意義。既然為了展示給用戶,那么就要為其提供一個entry point?!?b>桌面圖標(biāo)式”entry point就是系統(tǒng)默認(rèn)的、最方便的entry point。所以系統(tǒng)一定要你為這個唯一的acitivity設(shè)置以下兩個屬性:因?yàn)橄到y(tǒng)是根據(jù)這兩個屬性來決定是否為這個app創(chuàng)建出“桌面圖標(biāo)式”的entry point的。
<action android:name="android.intent.action.Main"/>和<categoryandroid:name="android.intent.category.LAUNCHER"/>
(2)你可能會說,非要用這種方式嗎?我可以通過命令去啟動這個activity啊?
? ? 但是app面向的是大眾,不是單純面向開發(fā)者??赡馨l(fā)者都知道可以通過adb shell am start -n packageName\.activityName這種方式去啟動一個應(yīng)用,但是并不是每一個人都是開發(fā)者。所以從谷歌設(shè)計(jì)安卓系統(tǒng)的初衷出發(fā),"桌面圖標(biāo)式"就是一個app最合適,最容易讓用戶接受的entry point了
4、由于我們想要的是在桌面上,有兩個icon都作為一個app的main entry point,所以對應(yīng)的,我們只要將ActivityA和ActivityB都設(shè)置成main entry point就可以了。具體的是指就是在AndroidManifest.xml文件中對應(yīng)的<activity>節(jié)點(diǎn)進(jìn)行配置。如下圖:

5、接下來,在我們安裝這個app之后,就會在桌面上看到兩個icon圖標(biāo)了,這兩個都是進(jìn)入同一個app的,但是進(jìn)入的是不同的activity。

6、這個時候,當(dāng)我們首次點(diǎn)擊第一個圖標(biāo),系統(tǒng)會幫我們打開ActivityA;首次點(diǎn)擊第二個圖標(biāo),系統(tǒng)會幫我們打開ActivityB。具體如下圖:


注意:這里指的是你首次通過點(diǎn)擊不同的圖標(biāo)啟動這個app,系統(tǒng)才會對應(yīng)的加載這個icon圖標(biāo)所默認(rèn)的mainActivity。因?yàn)閷τ谙到y(tǒng)來說,點(diǎn)擊桌面上的應(yīng)用程序圖標(biāo),只是launch這個app。如果這個app已經(jīng)打開了,那么直接將這個app從后臺喚醒到前臺,保持這個app之前進(jìn)入后臺的所有狀態(tài)。所以不會再去加載icon圖標(biāo)對應(yīng)的mainActivity。所以,當(dāng)我們通過第一個icon進(jìn)入app,顯示的是ActivityA,然后在點(diǎn)擊第二個圖標(biāo),那么打開的還是ActivityA(實(shí)際上,這步操作只是將app從后臺喚醒到前臺,因?yàn)檫@個app的進(jìn)程還在,并沒有被kill掉)。如果你想直接進(jìn)入ActivityB,那么應(yīng)該先進(jìn)入后臺將這個app kill掉,然后點(diǎn)擊第二個圖標(biāo),這樣就能直接加載ActivityB了。
從系統(tǒng)設(shè)計(jì)的角度出發(fā),這樣是非常合理的。因?yàn)椴荒茏層脩敉ㄟ^桌面圖標(biāo)的entry point點(diǎn)擊進(jìn)入一個已經(jīng)在后臺的app時,直接回到默認(rèn)的第一個mainActivity。而是要恢復(fù)這個app上一次進(jìn)入后臺的所有狀態(tài)才是符合用戶預(yù)期的。