Activity在AndroidManifest.xml中可以指明的launchMode可以有:
standard,singleTop,singleTask,singleInstance。这些启动模式是针对于Activity在Task中的位置,来产生不同。
1 standard 默认启动模式
每次通过standard启动Activity都会生成一个新的Activity实例,举例来说,
AndroidManifest.xml
<activity android:name=".My1Activity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="My1" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:name=".My2Activity" android:launchMode="standard" >
<intent-filter>
<action android:name="My2" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在 .My1Activity中连续启动两次.My2Activity
Intent intent=new Intent("My2");
startActivity(intent);
startActivity(intent);
通过命令行 adb shell dumpsys activity activities | grep -E “Stack #|Task id #| Hist #” 可以看到 .My2Activity在上层有两个实例
Stack #1:
Task id #122
* Hist #2: ActivityRecord{41f9c3c0 u0 com.alvin.activity.test/.My2Activity t122}
* Hist #1: ActivityRecord{41f82d40 u0 com.alvin.activity.test/.My2Activity t122}
* Hist #0: ActivityRecord{423d86f0 u0 com.alvin.activity.test/.My1Activity t122}
2 singleTop
每次通过singleTop启动Activity2,如果当前Task顶是Activity2,则不生成新的实例,但是会调用Activity2的onNewIntent方法。,否则会生成一个新的Activity实例(如同standard),举例来说,
<!--AndroidManifest.xml-->
<!--<activity android:name=".My2Activity" android:launchMode="standard" >-->
<activity android:name=".My2Activity" android:launchMode="singleTop" >
//在 .My1Activity中启动My2Activity
Intent intent=new Intent("My2");
startActivity(intent);
//在 .My2Activity中启动My2Activity
Intent intent=new Intent("My2");
startActivity(intent);
通过命令行 adb shell dumpsys activity activities | grep -E “Stack #|Task id #| Hist #” 可以看到 .My2Activity在上层有两个实例
Stack #1:
Task id #127
* Hist #1: ActivityRecord{41f63080 u0 com.alvin.activity.test/.My2Activity t127}
* Hist #0: ActivityRecord{420f57a8 u0 com.alvin.activity.test/.My1Activity t127}
3 singleTask
通过singleTask启动的Activity在当前Task中只能有一个实例,假设从Task底到顶是My1Activity,My2Activity,My3Activity 如果此时再去启动My2Activity。会清除My2Activity上的所有Activity并调用My2Activity的onNewIntent。否则跟standard一样。
<!--AndroidManifest.xml-->
<activity android:name=".My2Activity" android:launchMode="singleTask" >
<!--<activity android:name=".My2Activity" android:launchMode="singleTop" >-->
<intent-filter>
<action android:name="My2" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:name=".My3Activity">
<intent-filter>
<action android:name="My3" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
step 1.在 .My1Activity中启动My2Activity
startActivity(new Intent("My2"));
step 2.在 .My2Activity中启动My3Activity
startActivity(new Intent("My3"));
此时 Task为
Stack #1:
Task id #128
* Hist #2: ActivityRecord{422dd1a0 u0 com.alvin.activity.test/.My3Activity t128}
* Hist #1: ActivityRecord{41f63080 u0 com.alvin.activity.test/.My2Activity t128}
* Hist #0: ActivityRecord{41f7dbd8 u0 com.alvin.activity.test/.My1Activity t128}
step 3 在 .My3Activity中启动My2Activity
此时 Task为
Stack #1:
Task id #128
* Hist #1: ActivityRecord{41f63080 u0 com.alvin.activity.test/.My2Activity t128}
* Hist #0: ActivityRecord{41f7dbd8 u0 com.alvin.activity.test/.My1Activity t128}
4 singleInstance
通过singleInstance启动的Activity,总是在一个单独的Task里面,而且这个Task里面只有这一个Activity。多次启动只会调用Activity的onNewIntent方法。
<!--AndroidManifest.xml-->
<activity android:name=".My2Activity" android:launchMode="singleInstance" >
<!--<activity android:name=".My2Activity" android:launchMode="singleTop" >-->
<intent-filter>
<action android:name="My2" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
step 1.在 .My1Activity中启动My2Activity
startActivity(new Intent("My2"));
此时 Task为
Stack #1:
Task id #131
* Hist #0: ActivityRecord{43566f00 u0 com.alvin.activity.test/.My2Activity t131}
Task id #130
* Hist #0: ActivityRecord{4278c838 u0 com.alvin.activity.test/.My1Activity t130}
step 2.在 .My2Activity中启动My3Activity
startActivity(new Intent("My3"));
此时 Task为
Stack #1:
Task id #130
* Hist #1: ActivityRecord{43136f70 u0 com.alvin.activity.test/.My3Activity t130}
* Hist #0: ActivityRecord{4278c838 u0 com.alvin.activity.test/.My1Activity t130}
Task id #131
* Hist #0: ActivityRecord{43566f00 u0 com.alvin.activity.test/.My2Activity t131}
看到没有,My3Activity又重新回到了My1Activity中。但是不管怎么说它们都属于同一个Stack。但是此时如果在My3Activity上按back健会回到My1Activity。back是基于Task来操作的。Task会变成
Stack #1:
Task id #130
* Hist #0: ActivityRecord{4278c838 u0 com.alvin.activity.test/.My1Activity t130}
Task id #131
* Hist #0: ActivityRecord{43566f00 u0 com.alvin.activity.test/.My2Activity t131}
但是此时如果在My1Activity上按back健会回到My2Activity,Task会变成
Stack #1:
Task id #131
* Hist #0: ActivityRecord{43566f00 u0 com.alvin.activity.test/.My2Activity t131}