一 Activity task & stack
参考1-Tasks and Back Stack
参考2-android:launchMode
参考3-Recents Screen
二 查看 task & stack 两种方式
- $ adb shell dumpsys activity activities
-
android studio plugin, Activity Stack View
Activity-Stack-View.png
三 测试
-
说明,存在两个Applicaion, Application X, Application Y
Application X, 包含 XMainActivity
Application Y, 包含 YMainActivity, YSecondActivity, YThirdActivity -
测试手机 HUAWEI P20
-
测试 launchMode standard
standard
Default. The system creates a new instance of the activity in the task from which it was started and routes the intent to it. The activity can be instantiated multiple times, each instance can belong to different tasks, and one task can have multiple instances.
如果一个Activity的launchMode 设置为 standard,此Activity被启动时,可以被实例化多次,每个实例可以属于不同的task,
某一个task可以有多个此Activity的实例。
XMainActivity launchMode standard
YMainActivity launchMode standard
YSecondActivity launchMode standard
操作:
XMainActivity start YSecondActivity
YMainActivity start YSecondActivity
YSecondActivity start YSecondActivity
task & stack 如下图
standard-1.png standard-2.png
总结:
a. YSecondActivity 可以被实例化多次
b. YSecondActivity 可以属于不同的task
c. 在一个task中,YSecondActivity 可以存在多个
- 测试 launchMode singleTop
singleTop
If an instance of the activity already exists at the top of the current task, the system routes the intent to that instance through a call to its onNewIntent() method, rather than creating a new instance of the activity. The activity can be instantiated multiple times, each instance can belong to different tasks, and one task can have multiple instances (but only if the activity at the top of the back stack is not an existing instance of the activity).
与standard一样,除了一点,如果Activity实例已经被创建且处于栈顶,再次被启动时,不会创建Activity的实例,而是会调用其 onNewIntent()。
Activity不是处于栈顶的话,还是可以被创建多次,即与standart相同。
XMainActivity launchMode standard
YMainActivity launchMode standard
YSecondActivity launchMode singleTop
操作:
YMainActivity start YSecondActivity (YSecondActivity会被创建为新实例)
YSecondActivity start YSecondActivity(YSecondActivity不会被创建, 其onNewIntent会被调用)
task & stack 如下图
singleTop-1.png
此时,XMainActivity start YSecondActivity
YSecondActivity 还是会被创建,因为task不同,且栈顶不是YSecondActivity, 而是XMainActivity。
总结:
a. YSecondActivity 处于栈顶时,被启动时,不会被创建实例,只是onNewIntent会被调用
b. YSecondActivity 非栈顶时,与 standart 相同。
- 测试 launchMode singleTask
singleTask
The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to its onNewIntent() method, rather than creating a new instance. Only one instance of the activity can exist at a time.
系统会创建一个新的task和Activity的实例,此实例在栈底。
如果此Activity实例在某一个task中已经存在的话,当Activity被启动时,就不会再创建实例了,而是调用其 onNewIntent方法。
设置singleTask的Activity,实例只能有一个。
XMainActivity launchMode standard
YMainActivity launchMode standard
YSecondActivity launchMode singleTask
YThirdActivity launchMode standard
操作a:
ApplicationY没有启动
XMainActivity start YSecondActivity(XMainActivity启动没有启动过的YSecondActivity)
task & stack 如下图
singleTask-1.png
如图所示,YSecondActivity 与 XMainActivity 并不是在一个stack中,而是在一个新的stack中,且处于栈底。
此时,YSecondActivity start YSecondActivity, YSecondActivity不会被创建新的实例,只是onNewIntent(),即实例只有一个。
此时,YSecondActivity start YThirdActivity,结果如下图
singleTask-2.png
注意,虽然不在一个task中,但返回键的话,YSecondActivity 时一样能够返回到XMainActivity。
此时,多任务,启动Application X, XMainActivity start YSecondActivity,
stack中,YSecondActivity 之上的 YThirdActivity 被弹出栈.
操作b:
YMainActivity start YSecondActivity
task & stack 如下图:
singleTask-3.png
发现,YSecondActivity 并没有在一个新的stack中,而是在同一个。
此时,home 键,XMainActivity start YSecondActivity,(XMainActivity启动已启动过的YSecondActivity)
XMainActivity 所处的栈退到后台,
YSecondActivity所处的栈到前台,YMainActivity在栈底,YSecondActivity在栈顶,且onNewIntent被调用。
此时按返回键,YSecondActivity -》YMainActivity-》XMainActivity
总结:
a. YSecondActivity 没有启动过,XMainActivity 启动 YSecondActivity,YSecondActivity会在一个新的栈中,且在栈底。
b. YMainActivity start YSecondActivity, 俩activity在同一个栈中。
XMainActivity start 已经 启动过的 YSecondActivity,YSecondActivity不会再被创建实例,而是onNewIntent。
c. 任何时候,YSecondActivity 实例只有一个。
- 测试 launchMode singleInstance
singleInstance
Same as "singleTask", except that the system doesn't launch any other activities into the task holding the instance. The activity is always the single and only member of its task; any activities started by this one open in a separate task.
设置为singleInstance的 Activity,会在一个单独的栈中,且是唯一的一个。
实例同样只能有一个。
被此activity启动的activity,所处的栈,下面会演示。
XMainActivity launchMode standard
YMainActivity launchMode standard
YSecondActivity launchMode singleInstance
YThirdActivity launchMode standard
操作a:
YMainActivity start YSecondActivity
task & stack 如下图:
singleInstance-1.png
发现,YSecondActivity 确实处于一个新的栈中。
XMainActivity start YSecondActivity,效果同上。
singleInstance-2.png
操作b:
YMainActivity start YSecondActivity
YSecondActivity start YThirdActivity
task & stack 如下图:
singleInstance-3.png
发现,YThirdActivity 与 YMainActivity 是在同一个栈中。
返回键:YThirdActivity -》YMainActivity -》YSecondActivity
操作c:
XMainActivity start YSecondActivity
YSecondActivity start YThirdActivity
task & stack 如下图:
singleInstance-5.png
发现,此三个activity分别在不同的stack中。
返回键:YThirdActivity -》YSecondActivity -》XMainActivity
总结:
a. YSecondActivity 会在一个单独的栈中,且是唯一的一个。
b. YSecondActivity 实例只有一个。
c. YSecondActivity 所启动的 YThirdActivity,所在的栈,如上所示。
最后:
此篇只测试了 launchMode,其他如 Intent flags、affinities,请看后续文章。
网友评论