对于Android程序员来说,掌握活动的生命周期非常重要,当我们深入了解活动的生命周期以后,才能写出更流畅的APP,让我们更好的去分配资源,让应用程序有更好的用户体验。
我们首先来说一下,Android程序是用什么来管理活动的。
Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈。那什么是栈呢?栈是一种后进先出的数据结构。我的理解是,栈好比是一个容器,我们要依次往里面放置内容物(数据,Activity),而先放进去的,我们是必须要把最上面的(最后放进去的)先拿走,才能看到或者拿到。
默认的情况下,当我们启动一个新的Activity的时候,这个新启动的活动就会被压入返回栈中,处于栈的顶部,我们只能看到处于栈顶的这个活动,当我们按下Back返回键或者Finish()掉当前栈顶的活动时,它就会退出栈顶,之前被放入的活动(没有被Finish()掉)就会成为栈顶元素,呈现在我们面前。下面我们用一幅图来说明这个问题。
看完栈,我们再看一下活动的状态。《Android第一行代码》(郭霖著)中说,活动在其生命周期中最多可能会有四种状态:
运行状态:当活动位于栈顶时,就处于运行状态,系统最不愿意回收这样的活动,回收会导致很差的用户体验。个人认为就是程序闪退,崩溃等。
暂停状态:当活动不再处于栈顶,但是对用户依然可见时。不是说在栈顶的元素才对用户可见吗?这是因为不是每一个活动都是覆盖整个屏幕的,一些对话框形式的活动就只会占用一部分而已,比如Dialog。系统也是不愿意回收处于暂停状态的活动的,除非在万不得已的情况下。
停止状态:活动不再处于栈顶,并且完全不可见的时候,就会处于停止状态。但系统会保存相应的状态和变量,但是当内存不足时,还是会回收这一类的活动的。
销毁状态:当活动从栈中移除以后就变成了销毁状态。系统最乐意回收这类活动,以此来保证充足的内存。
我们再来用实际的例子来看一下活动的生存期以及生存期的转换。我会新建一个工程,用打印日志的方式来展示这种转换。先看一下经典的活动生命周期图。
下面来用实例展示
新建一个Android工程,启动的Activity我起名为FirstActivity,然后新建另外两个Activity,SecondActivity和ThirdActivity。(详情见附图)
然后为每个Activity重写它们的生命周期的方法,并且在方法里面打印Activity所处的状态。打印的时候,我们统一在打印的信息前加上字符串“Test-”,这样就可以在控制台里面清楚的看到执行不同的操作时,全部的活动执行生命周期的顺序。(附图)
然后我们在每个活动的Layout上面添加一个文本控件和一个按钮,用来跳转。
从第一个活动跳转到第二个活动时,我们只是跳转,不让第一个活动finish()掉,但是从第二个跳转到第三个时,我们让第二个活动finish()掉,下面我们来看一下活动的生命周期是怎么执行的。
1.启动程序,然后退出
2.启动程序,点击按钮跳转到SecondActivity
3.接着从SecondActivity跳转到ThirdActivity
4.在ThirdActivity中,点击物理的返回按钮
5.按Home键
其他不同的情况请自行探索。
好啦,今天就到此为止啦。