Activity棧主要用於管理Activity的切換。當使用Intent跳轉至某個目標Activity,需要根據目標Activity的加載模式來加載。
Activity一共有以下四種launchMode:
1.standard:默認,每次使用Intent跳轉到目標Activity時都創建一個新的實例。壞處是每次進入都要創建新的實例,執行OnCreate方法。
2.singleTop:如果要跳轉的目標Activity正好在task的頂部(說明當前肯定不在目標task里,例如我在微信首頁,然后想使用Intent跳轉到InnoXYZ應用的首頁,那么加入InnoXYZ首頁正好在InnoXYZ的task頂部,就直接跳轉而不會創建實例),那么就直接跳轉過去而不會創建新的。(例子,當前在Home Screen, 收到一條微信首頁的推送,而此時task棧里的微信task里的Activity棧里的最頂部正好就是微信首頁,那么點擊推送就直接進入該實例而不會創建新的實例)
3.singleTask:會在一個新的task中產生這個實例,以后每次調用都會使用這個,不會去產生新的實例了。
4.singleInstance:是其所在棧的唯一activity,它會每次都被重用。
launchMode在多個Activity跳轉的過程中扮演着重要的角色,它可以決定是否生成新的Activity實例,是否重用已存在的Activity實例,是否和其他Activity實例公用一個task里。這里簡單介紹一下task的概念,task是一個具有棧結構的對象,一個task可以管理多個Activity,啟動一個應用,也就創建一個與之對應的task。
我們可以在AndroidManifest.xml配置<activity>的android:launchMode屬性為以上四種之一即可。
android:exported
-
在Activity中該屬性用來標示:當前Activity是否可以被另一個Application的組件啟動:true允許被啟動;false不允許被啟動。
-
android:exported 是Android中的四大組件 Activity,Service,Provider,Receiver 四大組件中都會有的一個屬性。
-
總體來說它的主要作用是:是否支持其它應用調用當前組件。
<intent-filter>
意圖過濾器說白了就是在你啟動程序時,最先啟動的是那個activity。所以說<intent-filter>是必須有的。 否則android不知道先啟動誰。
<action android:name="android.intent.action.MAIN" />,意思是這個MainActivity在第一位就是先啟動MainActivity??
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="android.app.AliasActivity">
</activity>
像這個代碼里有兩個activity, 第一個有 <intent-filter>,第二個沒有,所以說先啟動的就是第一個,”