Android activity启动模式理解

        这里我们引入《Android入门到精通》,activity组件说明,在Android应用程序中,一个activity表现形式为一个单独的界面,每一个Activity的类都是一个单独类,它扩展了Activity的基础类,这个类是有一个view组成用户界面,并响应事件,一个程序中包含多个activity。当它在打开或者切换另一个activity的时候,就是载入一个新的activity。

        打开一个新的界面,上一个界面就是暂停,并放入历史的栈中,使用者可以回溯到前面已经打开的存放在历史栈中的界面。也可以删除历史栈中没有价值的界面。Android历史栈中保留程序中产生的所有界面:从第一个界面到最后一个。

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。(注意,这里说明是在竖屏的模式下开始测试的,不考虑横竖屏切换的情况下

1.建立demo,生成A,B,C,D界面。每个页面的生命周期事件都log出来提示。

 

Android activity启动模式理解_第1张图片

2.测试standard模式去启动这个四个界面:

         启动A,重新打开A界面(我这里点击两次):

 

Android activity启动模式理解_第2张图片

     

打印出来的各自的生命周期事件:

可以看出默认启动模式是,每一次去跳转一个activity都是去oncreate一个界面。

当我从A->B->C->D->A,点击返回按钮(A->D->C->B->A),事件是:

3.测试singleTop模式去启动这个四个界面:

文件清单添加;

android:launchMode="singleTop"

启动A,重新打开A界面(我这里点击两次):

Android activity启动模式理解_第3张图片

singleTop与standard的启动模式是相似的,但是有一点不同的是,singleTop,将要启动的目标activity如果在栈顶时,系统将不会重新创建该activity的实例而是直接复用。

4.测试SingleTask 栈内复用模式去启动这个四个界面:

A->B->C->D->A:

Android activity启动模式理解_第4张图片

LOG:

2020-07-03 14:09:33.203 16086-16086/com.example.test_01 I/A界面: onCreate
2020-07-03 14:09:33.205 16086-16086/com.example.test_01 I/A界面: onStart
2020-07-03 14:09:33.206 16086-16086/com.example.test_01 I/A界面: onResume
2020-07-03 14:09:56.207 16086-16086/com.example.test_01 I/A界面: onPause
2020-07-03 14:09:56.228 16086-16086/com.example.test_01 I/B界面: onCreate
2020-07-03 14:09:56.229 16086-16086/com.example.test_01 I/B界面: onStart
2020-07-03 14:09:56.231 16086-16086/com.example.test_01 I/B界面: onResume
2020-07-03 14:09:56.648 16086-16086/com.example.test_01 I/A界面: onStop
2020-07-03 14:10:10.651 16086-16086/com.example.test_01 I/B界面: onPause
2020-07-03 14:10:10.670 16086-16086/com.example.test_01 I/C界面: onCreate
2020-07-03 14:10:10.671 16086-16086/com.example.test_01 I/C界面: onStart
2020-07-03 14:10:10.672 16086-16086/com.example.test_01 I/C界面: onResume
2020-07-03 14:10:11.093 16086-16086/com.example.test_01 I/B界面: onStop
2020-07-03 14:10:22.405 16086-16086/com.example.test_01 I/C界面: onPause
2020-07-03 14:10:22.426 16086-16086/com.example.test_01 I/D界面: onCreate
2020-07-03 14:10:22.427 16086-16086/com.example.test_01 I/D界面: onStart
2020-07-03 14:10:22.429 16086-16086/com.example.test_01 I/D界面: onResume
2020-07-03 14:10:22.855 16086-16086/com.example.test_01 I/C界面: onStop
2020-07-03 14:10:34.844 16086-16086/com.example.test_01 I/B界面: onDestroy
2020-07-03 14:10:34.876 16086-16086/com.example.test_01 I/C界面: onDestroy
2020-07-03 14:10:34.892 16086-16086/com.example.test_01 I/D界面: onPause
2020-07-03 14:10:34.908 16086-16086/com.example.test_01 I/A界面: onRestart
2020-07-03 14:10:34.908 16086-16086/com.example.test_01 I/A界面: onStart
2020-07-03 14:10:34.909 16086-16086/com.example.test_01 I/A界面: onResume
2020-07-03 14:10:35.324 16086-16086/com.example.test_01 I/D界面: onStop
2020-07-03 14:10:35.324 16086-16086/com.example.test_01 I/D界面: onDestroy

可以看出,由于A界面已经启动了一次,当再次打开A时候,会将BCD依次去销毁。只保留A界面。

 

5.测试singleTop栈内复用模式去启动这个四个界面:

A->B->C->D->A->B:

Android activity启动模式理解_第5张图片

 可以看见,当我创建了界面的activity,当再次去打开的时候,也是不会去再次去创建,而是重启显示出来。

 

值得注意的一点是:SingleTask加载的activity会再同一个Task中只有一个实例,有三种情况:

1.启动的目标activity不存在,系统创建activity实例,并加入Task栈顶。

2.启动的目标activity存在,系统创建activity,但没有在Task栈顶,系统会把改activity上面的栈顶移出去,使目标activity转入栈顶。

3.启动的目标activity已经在栈顶了,就跟singleTop的一样。

 

SingleInstance,当系统保证无论哪个Task启动目标activity,只会创建一个实例,会启动全新的Task栈来装载目标activity。

这里分两种情况:

1.启动的目标activity不存在,系统创建新的Task,再创建activity实例,并加入新的Task栈顶。

2.启动的目标activity存在,无论存在哪个应用程序中,无论在哪个Task,系统都会在后台显示出来。

    在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例,所有一般开发中很少用到这种启动模式,但并不是没有使用。

你可能感兴趣的:(Android,Android+kotlin,android)