Activity的启动模式(二)

这里就是做了一个关于启动模式的小实验,实验代码可以在此处下载:http://download.csdn.net/detail/al4fun/9882278

实验过程如下:

第一个app:MyApplication

应用包名:cn.szx.myapplication
<activity android:name=".MainActivity">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />

		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>

<activity android:name=".Main2Activity"/>

点击MainActivity中的TextView就会打开Main2Activity。两个activity均为标准启动模式。

第二个app:Test

应用包名:cn.szx.test	
<activity android:name=".MainActivity">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />

		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>

<activity
	android:name=".Main2Activity"
	android:launchMode="singleTask"
	android:taskAffinity="cn.szx.myapplication" />

点击MainActivity中的TextView就会打开Main2Activity。MainActivity为标准启动模式;Main2Activity为singleTask启动模式,并且taskAffinity为第一个app的应用包名。

启动实验

  1. 打开MyApplication(MainActivity被启动),点击其中的TextView打开MyApplication的Main2Activity
  2. 点击home键回到桌面
  3. 打开Test(MainActivity被启动),点击其中的TextView打开Test的Main2Activity

启动实验结果分析

此时使用adb shell dumpsys activity查看任务栈的情况如下:

Running activities (most recent first):
	TaskRecord{2d0c1dd #124 A=cn.szx.myapplication U=0 sz=3}
		Run #3: ActivityRecord{6ad103e u0 cn.szx.test/.Main2Activity t124}
	TaskRecord{be21152 #125 A=cn.szx.test U=0 sz=1}
		Run #2: ActivityRecord{242d78c u0 cn.szx.test/.MainActivity t125}
	TaskRecord{2d0c1dd #124 A=cn.szx.myapplication U=0 sz=3}
		Run #1: ActivityRecord{e1721e2 u0 cn.szx.myapplication/.Main2Activity t124}
		Run #0: ActivityRecord{a6609f3 u0 cn.szx.myapplication/.MainActivity t124}

可见,最近启动过4个activity,它们分别存在于两个任务栈中:

  • TaskRecord{be21152 #125 A=cn.szx.test U=0 sz=1}
  • TaskRecord{2d0c1dd #124 A=cn.szx.myapplication U=0 sz=3}

MyApplication的两个Activity和Test的Main2Activity位于任务栈cn.szx.myapplication中,而Test的MainActivity位于任务栈cn.szx.test中。

启动过程分析:

  1. 打开MyApplication(MainActivity被启动):创建默认的任务栈cn.szx.myapplication,并将MainActivity入栈。
  2. 点击其中的TextView打开MyApplication的Main2Activity:将Main2Activity入栈到任务栈cn.szx.myapplication中。
  3. 点击home键回到桌面:将任务栈cn.szx.myapplication转入后台。
  4. 打开Test(MainActivity被启动):创建默认的任务栈cn.szx.test,并将MainActivity入栈。
  5. 点击其中的TextView打开Test的Main2Activity:检查发现Main2Activity的启动模式为singleTask且其taskAffinity为cn.szx.myapplication,于是在android系统中查找是否存在名为cn.szx.myapplication任务栈,发现已存在任务栈cn.szx.myapplication,于是将其转到前台,并将Main2Activity入栈。

虽然Test的Main2Activity位于任务栈cn.szx.myapplication中,但它仍然是属于Test的(运行demo你会发现其标题栏上显示的是Test,而不是MyApplication)。

关闭实验

在完成上面的启动实验的基础上,当我们连续点击返回键即逐个关闭activity时,会依次看到如下页面:

  1. 初始状态显示的是Test的Main2Activity, -> 点击返回键 ->
  2. 显示MyApplication的Main2Activity, -> 点击返回键 ->
  3. 显示MyApplication的MainActivity, -> 点击返回键 ->
  4. 显示Test的MainActivity, -> 点击返回键 ->
  5. 显示桌面

关闭实验结果分析

发布了46 篇原创文章 · 获赞 38 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/al4fun/article/details/73823586