Activity生命周期与任务栈

Activity的生命周期

Activity整个的生命周期如下所示,这张图是从Android API上扒下来了,我觉得API上关于生命周期已经讲解的很详细了,我也就不啰嗦了,就简要的说下自己的一些总结:

做工作中,你可能感兴趣的三个关键环① 完整生命周期② 可见生命周期③ 可交互生命周期 如图所示,图中的周期都是大的包括小的:

在实际工作中的使用①onResume可见, 可交互.。把动态刷新的操作启动。②onPause部分可见, 不可交互. 把动态刷新的一些操作, 给暂停了。③onCreate 初始化一些大量的数据④onDestroy 把数据给释放掉, 节省内存。横竖屏切换问题

 横竖屏切换时,默认情况下会把activity先销毁再创建,在类似手机游戏这一类的应用中,这个体验是非常差的。不让Activity在横竖屏切换时销毁,只需要在清单文件声明Activity时配置<activity>节点的几个属性即可,其方式如下:

android:configChanges=”orientation|keyboardHidden|screenSize”解释①configChange=”orientation”屏幕方向改变:不让屏幕在切换时重新创建activity②sreensize 屏幕大小③keyboardHidden是软键盘,如果切换屏幕,软键盘会去判断屏幕大小是否合适显示软键盘,在判断过程中会重启activity设置横屏或者竖屏android:screenOrientation=”portrait” 竖屏android:screenOrientation=”landscape”横屏任务栈的概念任务栈是用来提升用户体验而设计的:(1) 程序打开时就创建了一个任务栈, 用于存储当前程序的activity,所有的activity属于一个任务栈。(2) 一个任务栈包含了一个activity的集合, 去有序的选择哪一个activity和用户进行交互:只有在任务栈栈顶的activity才可以跟用户进行交互。(3) 任务栈可以移动到后台, 并且保留了每一个activity的状态. 并且有序的给用户列出它们的任务, 而且还不丢失它们状态信息。(4) 退出应用程序时:当把所有的任务栈中所有的activity清除出栈时,任务栈会被销毁,程序退出。任务栈的缺点:(1) 每开启一次页面都会在任务栈中添加一个Activity,而只有任务栈中的Activity全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用,户体验差, 需要点击多次返回才可以把程序退出了。(2) 每开启一次页面都会在任务栈中添加一个Activity还会造成数据冗余, 重复数据太多, 会导致内存溢出的问题(OOM)。

为了解决任务栈产生的问题,Android为Activity设计了启动模式,那么下面的内容将介绍Android中Activity的启动模式,这也是最重要的内容之一。

Activity的4种启动模式

 启动模式(launchMode)在多个Activity跳转的过程中扮演者重要的角色,它可以解决是否生成新的Activity实例,是否重用已经存在的Activity实例,是否和其他实例共用一个任务栈。任务栈是一个具有站结构的对象,一个任务栈可以管理多个Activity,每启动一个应用,也就创建一个与之对应的任务栈。

Activity一共有以下四种launchMode模式:① standard② singTop③ singTask④ singleInstance

我们可以在AndroidManifest.xml配置<activity>的android:launchMode属性为以上四种之一即可。

为了详细讲解启动模式,我们创建一个工程,里面有两个Activity,分别是FirstActivity和SecondActivity,启动模式都是standard。下面是界面截图和关键代码: 界面一

界面二

FirstActivity文件:

(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_first);System.out.println(“当前任务栈ID:” + getTaskId() + “当前是第一个界面(” + this.toString()+”)”);}() {super.onDestroy();System.out.println(“第一个界面(“+this.toString() + “)退出任务栈”);}

SecondActivity文件

(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);System.out.println(“当前任务栈ID:” + getTaskId() + “当前是第二个界面(” + this.toString()+”)”);}() {super.onDestroy();System.out.println(“第二个界面(“+this.toString() + “)退出任务栈”);}standard 详细讲解概述:在本模式中,不管有没有已存在的实例,都生成新的实例。即每次调用startActivity()启动时都会创建一个新的Activity放在栈顶,可重复创建。操作:启动程序后,执行以下操作 ①激活第二个界面 -> 激活第一个界面 -> 激活第二个界面 -> 激活第一个界面 ->激活第二个界面 ②狂按返回键打印的Log如下所示:

栈中的情况如下所示:

每次激活都会创建新的实例,每次返回都会销毁实例并出栈

singleTop详细讲解概述:如果任务栈的栈顶存在这个要开启的activity,不会重新的创建activity,而是复用已经存在的activity。保证栈顶如果存在,不会重复创建。

为了讲解的更清楚,我在按钮中加入了如下Log

(View v) {Intent intent = new Intent(this, FirstActivity.class);startActivity(intent);System.out.println(“想要激活第一个页面”);}(View v) {Intent intent = new Intent(this, SecondActivity.class);startActivity(intent);System.out.println(“想要激活第二个页面”);}操作:启动后执行一下操作 ①激活第二个界面 -> 激活第一个界面 -> 激活第一个界面 -> 激活第一个界面 ②按三次返回键打印的Log如下所示:

栈中的情况如下所示:

与其在那里苦苦挣扎,碍于面子硬撑,倒不如微笑着面对,

Activity生命周期与任务栈

相关文章:

你感兴趣的文章:

标签云: