这里我们引入《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界面: onCreate2020-07-03 14:09:33.205 16086-16086/com.example.test_01 I/A界面: onStart2020-07-03 14:09:33.206 16086-16086/com.example.test_01 I/A界面: onResume2020-07-03 14:09:56.207 16086-16086/com.example.test_01 I/A界面: onPause2020-07-03 14:09:56.228 16086-16086/com.example.test_01 I/B界面: onCreate2020-07-03 14:09:56.229 16086-16086/com.example.test_01 I/B界面: onStart2020-07-03 14:09:56.231 16086-16086/com.example.test_01 I/B界面: onResume2020-07-03 14:09:56.648 16086-16086/com.example.test_01 I/A界面: onStop2020-07-03 14:10:10.651 16086-16086/com.example.test_01 I/B界面: onPause2020-07-03 14:10:10.670 16086-16086/com.example.test_01 I/C界面: onCreate2020-07-03 14:10:10.671 16086-16086/com.example.test_01 I/C界面: onStart2020-07-03 14:10:10.672 16086-16086/com.example.test_01 I/C界面: onResume2020-07-03 14:10:11.093 16086-16086/com.example.test_01 I/B界面: onStop2020-07-03 14:10:22.405 16086-16086/com.example.test_01 I/C界面: onPause2020-07-03 14:10:22.426 16086-16086/com.example.test_01 I/D界面: onCreate2020-07-03 14:10:22.427 16086-16086/com.example.test_01 I/D界面: onStart2020-07-03 14:10:22.429 16086-16086/com.example.test_01 I/D界面: onResume2020-07-03 14:10:22.855 16086-16086/com.example.test_01 I/C界面: onStop2020-07-03 14:10:34.844 16086-16086/com.example.test_01 I/B界面: onDestroy2020-07-03 14:10:34.876 16086-16086/com.example.test_01 I/C界面: onDestroy2020-07-03 14:10:34.892 16086-16086/com.example.test_01 I/D界面: onPause2020-07-03 14:10:34.908 16086-16086/com.example.test_01 I/A界面: onRestart2020-07-03 14:10:34.908 16086-16086/com.example.test_01 I/A界面: onStart2020-07-03 14:10:34.909 16086-16086/com.example.test_01 I/A界面: onResume2020-07-03 14:10:35.324 16086-16086/com.example.test_01 I/D界面: onStop2020-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实例,所有一般开发中很少用到这种启动模式,但并不是没有使用。

更多相关文章

  1. execlp启动android进程命令窗口通过adb shell 进入android 的Lin
  2. android 笔记 --- Android开发中Virtual Device仿真界面对应的快
  3. android usb Host模式下与usb Hid 设备的通信
  4. android位图颜色模式的问题
  5. 视图模式:Android ViewPager & WP Pivot
  6. NDK编译Android字符界面的可执行程序
  7. Android UI开发专题(一) 之界面设计
  8. Android基础笔记(三)-数据存储和界面展现
  9. 两个界面的切换

随机推荐

  1. 面向 Java 开发人员的 Scala 指南:包和访
  2. 01500105_MLDN-魔乐科技-李兴华【Java核
  3. java程序运行机制和jvm
  4. 小弟申请当版主!
  5. spring实现java的邮件发送
  6. J2EE4层体系结构
  7. java 导出excel 格式与文件扩展名指定的
  8. 2016年团体程序设计天梯赛-初赛 - 重要的
  9. 打造Linux下vim之(一)vim中的JavaScript插
  10. java对象判断是否为空工具类