2012-11-26分類:Android, 學習課堂, 開發, 隨手執行個體 |
標籤:Action, Activity, Android課堂, 多入口, Category, DEFAULT, Intent, Launcher,MAIN, singleInstance | 評論關閉
最近仔細複習了一下Intent中的相關知識,發現這一塊的內容用起來說簡單也簡單,但是一深究下去,也有許多好玩的東西。
本篇中我們就主要來談一下如果實現應用程式的多入口。
什麼意思呢?
就是一個應用,安裝後,在“所有應用”裡面出現了多個入口 。
主要用於什麼情況呢?
主要用於我們程式多個功能時,為了便於使用者啟動想要的功能, 則可以做成一個應用,多個入口 ,直接在“所有應用”中選擇相應的表徵圖就可以直接引入到程式的相應的功能介面去。
在正式開始講之前呢,我們需要再複習一下Action 與Category的知識:
Action主要是指名Intent的一個動作,在隱式請求Intent中,如果沒有Action ,則不能匹配到任何的Activity來執行此Intent.
Category主要是指定一個Intent 的類別。與Action配合才能更具體是表示一個 Intent的意圖。
系統也為我們提供了許多的Action與Category。在這裡我們主要是介紹一下我們在本內容中會使用到的Action 與Category,至於其它的,大家可以網上搜尋一下,一大堆。
- android.intent.action.MAIN
- 它主要是決定我們程式的入口。因為我們的應用可能不止一個activity ,
- 但是在啟動的時候應該啟動哪個activity呢?就是則它決定的。
- android.intent.category.LAUNCHER
- 它主是決定是否需要將圖片顯示到Launcher的"所有應用"中去。
- android.intent.category.DEFAULT
- 預設的一個category .
我們平時在程式中,對入口的定義,一般是用的android.intent.action.MAIN和android.intent.category.LAUNCHER。這個大家都都應該清楚 。
但是android.intent.category.DEFAULT又用在何處呢?什麼時候該用android.intent.category.DEFAULT呢?
我前面的一個文章 Android課堂-Intent匹配,你知多少? 中講到,我們的Intent啟動分為兩種,一種是顯式的,一種是隱式的。
intent到底發給哪個activity,需要進行三個匹配,一個是action,一個是category,一個是data。
理論上來說,如果intent不指定category,那麼無論intent filter的內容是什麼都應該是匹配的。但是,如果是我們在代碼中使用的是隱式的Intent,android預設給加上一個CATEGORY_DEFAULT,這樣的話如果intent filter中沒有android.intent.category.DEFAULT這個category的話,匹配測試就會失敗。所以,如果你的 activity支援接收隱式intent啟動的話就一定要在intent filter中加入android.intent.category.DEFAULT。
當然,有個例外,就是要程式有入口activity中他們已經定義了android.intent.action.MAIN和android.intent.category.DEFAULT,我們可以省略掉android.intent.category.DEFAULT,當然,你加上也不會有錯。
講了action和category,我們再來看看我們的主要任務:如果實現一個應用多個入口 ?
經過上面的講解,可能你也已經猜到了,使用android.intent.action.MAIN和android.intent.category.DEFAULT。
我們下面來看一看代碼:
- <activity android:name=".MainActivity"
- android:label="Test_Main">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="com.krislq.broadcast.First" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".SecondActivity"
- android:label="Test_Second">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="com.krislq.broadcast.Second" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
我們再運行一下看看效果?
但是細心的人多測試幾次就會發現,當我們在Test_Main介面中,點擊Home鍵切換到後台,點擊Test_Second的表徵圖時,就會進入Test_Main.
為什麼會這樣呢?
因為雖然是兩個入口,但是他們都是屬於同一個應用的,你按Home鍵切換到後台,程式還在運行,這時再點擊Test_Second,系統會顯示上次程式的停留介面,而並不會去啟動一個新的應用。
如何讓他們兩個入口相互不影響呢?
我們可以修改Activity的LaunchMode為singleInstance。
- <activity android:name=".MainActivity"
- android:label="Test_Main"
- android:launchMode="singleInstance">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="com.krislq.broadcast.First" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".SecondActivity"
- android:label="Test_Second"
- android:launchMode="singleInstance">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="com.krislq.broadcast.Second" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
但是我們修改成singleInstance後,我們的兩個activity就不能初始化執行個體出來了哦。
所以大家在使用的時候,一定要衡量每種辦法的權重。