Activity启动模式实验
这一节的东西真的得多看多想多试验…
2个应用A与B,都各有3个Activity 分别为A1 A2 A3, B1 B2 B3 同时重写B中Activity的OnDestroy()方法,以此判断B中Activity状态。
standard 默认启动模式
特点:每次这个activity都会重新实例化。
1个应用 A
| 动作 | task状态 | 界面显示 |
---|
打开 A1 | A1 | A1 |
打开 A2 | A2 A1 | A2 |
打开 A1 | A1 A2 A1 | A1 |
打开 A1 | A1 A1 A2 A1 | A1 |
返回键 | A1 A2 A1 | A1 |
返回键 | A2 A1 | A2 |
返回键 | A1 | A1 |
返回键 | | 主界面 |
2个应用 A B
| 动作 | A task状态 | B task状态 | 返回栈状态 | 界面显示 |
---|
打开A1 | A1 前台 | | A1 | A1 |
打开A2 | A2 A1 前台 | | A2 A1 | A2 |
打开A1 | A1 A2 A1 前台 | | A1 A2 A1 | A1 |
打开B2 | B2 A1 A2 A1 前台 | | B2 A1 A2 A1 | B2 |
打开B3 | B3 B2 A1 A2 A1 前台 | | B3 B2 A1 A2 A1 | B3 |
打开A2 | A2 B3 B2 A1 A2 A1 前台 | | A2 B3 B2 A1 A2 A1 | A2 |
返回键 | B3 B2 A1 A2 A1 前台 | | B3 B2 A1 A2 A1 | B3 |
返回键 | B2 A1 A2 A1 前台 | | B2 A1 A2 A1 | B2 |
返回键 | A1 A2 A1 前台 | | A1 A2 A1 | A1 |
返回键 | A2 A1 前台 | | A2 A1 | A2 |
返回键 | A1 前台 | | A1 | A1 |
返回键 | | | | 主界面 |
singleTop 模式
特点:当且仅当要打开的这个activity处于前台时(或返回栈的顶部 既 可见),才不重建,其他情况仍然重新实例化。
一个应用 A
| 动作 | task状态 | 界面显示 |
---|
打开 A1 | A1 | A1 |
打开 A2 | A2 A1 | A2 |
打开 A1 | A1 A2 A1 | A1 |
打开 A1 | A1 A2 A1 | A1 |
返回键 | A2 A1 | A2 |
返回键 | A1 | A1 |
返回键 | | 主界面 |
两个应用类似的
略
singleTask 模式
特点:同一时刻,一个activity只会存在一个实例,既 只要这个activity的实例存在,那么就会把这个activity所在的
task 置为前台,并且在这个task中会把这个activity之前的activity杀死 以保证其在前台显示。
若不存在这个activity实例,则会新建一个task,并把此activity作为根放进去。(这里有点问题,如果是同一个应用的话,比如打开A1 A2 A3,是会放在一个task中呢,还是放在3个task中呢?我认为的是A1 A2 A3处于同一个返回栈,也处于同一个task)
一个应用 A
| 动作 | task状态 | 界面显示 |
---|
打开 A1 | A1 | A1 |
打开 A2 | A2 A1 | A2 |
打开 A3 | A3 A2 A1 | A3 |
打开 A2 | A2 A1 | A2 |
打开 A1 | A1 | A1 |
返回键 | | 主界面 |
两个应用 A B
注意第二次打开A2的时候 | 动作 | A task状态 | B task状态 | 返回栈状态 | 界面显示 |
---|
打开 A1 | A1 前台 | | A1 | A1 |
打开 A2 | A2 A1 前台 | | A2 A1 | A2 |
打开 A3 | A3 A2 A1 前台 | | A3 A2 A1 | A3 |
Home键 | A3 A2 A1 后台 | | | 主界面 |
打开 B1 | A3 A2 A1 后台 | B1 前台 | B1 | B1 |
打开 B2 | A3 A2 A1 后台 | B2 B1 前台 | B2 B1 | B2 |
打开 B3 | A3 A2 A1 后台 | B3 B2 B1 前台 | B3 B2 B1 | B3 |
打开 A2 | A2 A1 前台 | B3 B2 B1 后台 | (A2 A1) (B3 B2 B1) | A2 |
返回键 | A1 前台 | B3 B2 B1 后台 | (A1) (B3 B2 B1) | A1 |
返回键 | | B3 B2 B1 前台 | B3 B2 B1 | B3 |
返回键 | | B2 B1 前台 | B2 B1 | B2 |
返回键 | | B1 前台 | B1 | B1 |
返回键 | | 主界面 | | 主界面 |
singleInstance 模式
一个应用 A
在task状态中一个括号代表一个task,如果括号中有可见,那么这个task就是处于前台。其他的处于后台。
| 动作 | task状态 | 界面显示 |
---|
打开 A1 | A1 可见 | A1 |
打开 A2 | (A2 可见)(A1) | A2 |
打开 A3 | (A3 可见)(A2)(A1) | A3 |
打开 A2 | (A2 可见)(A3) (A2)(A1) | A2 |
返回键 | (A3 可见)(A2)(A1) | A3 |
返回键 | (A2 可见)(A1) | A2 |
返回键 | (A1 可见) | A1 |
返回键 | | 主界面 |
两个应用 A B
| 动作 | task状态 | 返回栈状态 | 界面显示 |
---|
打开 A1 | A1 | A1 | A1 |
打开 A2 | (A2 可见) (A1) | (A2)(A1) | A2 |
打开 B2 | (B2 可见) (A2)(A1) | (B2)(A2)(A1) | B2 |
Home键 | (B2)(A2)(A1) | | 主屏幕 |
打开 B1 | (B1 可见)(B2)(A2)(A1) | B1 | B1 |
打开 B2 | (B1)(B2可见) (A2)(A1) | (B1)(B2) | B2 |
返回键 | (B1可见) (A2)(A1) | B1 | B1 |
返回键 | (A2)(A1) | | 主界面 |
singleInstance模式会启动一个新的返回栈来管理这些活动。假设我们有应用中有一个activity是想可以让其他程序调用,并且我们想实现其他应用和我们的应用可以共享这个活动的实例,用前三种启动模式是实现不了的,因为每个应用都会有自己的返回栈,同一个activity在不同的返回栈中入栈时必然创建了新的实例。而singleInstance模式可以解决这个问题。在这种模式下会有一个单独的返回栈来管理这个activity,不管是哪个应用来访问这个activity,都共用同一个返回栈。于是就解决了共享这个activity实例的问题。
以上内容很多都是我自己的理解,如果有不对的地方,请指出来,万分感谢。