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

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

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

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

 

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

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

 

     

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

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

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

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

文件清单添加;

android:launchMode="singleTop"

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

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

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

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

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:

 可以看见,当我创建了界面的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应用程序启动过程源代码分析
  4. Android开机启动shell脚本(Android(安卓)8.0测试OK)
  5. Android(安卓)Launcher 分析
  6. (亲测有效)Android(安卓)SDK Manager国内无法更新的解决方案
  7. 【Android】Android(安卓)4.0 无法接收开机广播的问题
  8. android之四大组件之一-Activity(三)
  9. 从Android界面开发谈起

随机推荐

  1. android 笔记 --- Android(安卓)Shadow
  2. Android零碎知识点
  3. LibGDX制作android动态壁纸
  4. android 底座充电压力插拔,有概率没有提示
  5. Android一些经常涉及到的权限【转】
  6. android中使用wakelock
  7. [Android(安卓)Develop_004] Android(安
  8. Relativelayout的一些属性
  9. [置顶] android调用第三方库——第二篇—
  10. windows 8环境—android studio初步体验(