欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android activity启动模式理解

程序员文章站 2022-04-18 12:47:27
这里我们引入《Android入门到精通》,activity组件说明,在Android应用程序中,一个activity表现形式为一个单独的界面,每一个Activity的类都是一个单独类,它扩展了Activity的基础类,这个类是有一个view组成用户界面,并响应事件,一个程序中包含多个activity。当它在打开或者切换另一个activity的时候,就是载入一个新的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启动模式理解

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

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

 

Android activity启动模式理解

     

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

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

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

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

文件清单添加;

android:launchMode="singleTop"

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

Android activity启动模式理解

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

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

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

Android activity启动模式理解

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启动模式理解

 可以看见,当我创建了界面的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实例,所有一般开发中很少用到这种启动模式,但并不是没有使用。

本文地址:https://blog.csdn.net/qq_36771930/article/details/107100868