深入理解Android Activity生命周期

ActivityAndroid四大组件之一,提供了一个可视化的界面,负责与用户进行交互,所以Activity在整个Android开发中有着非常重要的地位。理解并掌握Activity的生命周期就显得尤为重要。

Activity的生命周期涉及到以下几个方法:onCreate(),onStart(),onRestart(),onResume().onPause(),onStop(),

onDestroy().正常情况下,一个Activity启动要走的方法依次是:onCreate(),onStart(),onResume().这时候Activity呈现

在用户的面前。ActivityActivityManager来管理,已经启动的Activity放在一个Activity栈里。呈现在用户面前的

Activity位于Activity栈的最顶端。如果Activity已经呈现在用户面前,这时候点击返回键,Activity要走的方法依次是:

onPause(),onStop(),onDestroy().Activity已经销毁了。如果Activity已经呈现在用户面前,这时候我们不是点击放回键而

是点击home键,这时候Activity要走的方法依次是:onPause(),onStop().这时候Activity已经处于后台中运行。如果这时候我们启动这个在后台运行的Activity,这个启动过程要走的方法便是:onRestart(),onStart(),onResume().

以上便是Activity生命周期基本的表述。稍微解释下以上的几个方法。OnCreate()方法是指创建Activity的时候进行触发,随后执行onStart(),这时候Activity都是在做呈现在用户面前的准备工作。当执行onResume()方法时,这时候Activity就已经呈现在用户面前了。如果这时候在Activity的上面覆盖了一个透明的对话框或者Activity,这时候Activity是可见的,但是已经没有了焦点,onPause()方法便会触发。如果Activity已经不再可见,便说Activity已经在后台运行,这时候onStop()方法便会触发。如果Activityfinish了或者被销毁了,onDestroy()方法便会被触发。需要注意的是onStop()onDestroy()方法并不是总是执行。如果内存资源比较吃紧,系统将会杀死Activity,这时候onStoponDestroy方法就有可能不会执行。所以,如果想在Activity退出的时候做一些其他的处理的话,这些操作要在onPause里进行。

上面简单介绍了一下Activity生命周期的基本知识。下面举一个例子来阐述下这些基础知识。

有两个ActivityA以及ActivityB,在ActivityA 上有一个按钮,点击这个按钮就会跳转至ActivityBActivityB

上同样有一个按钮,点击这个按钮就会跳转至ActivityA

好,下面点击ActivityA上的按钮,我们会得到以下内容:

AonPause

BonCreate

BonStart

BonResume

AonStop

1)这时候如果点击ActivityB上的按钮,我们会得到以下内容:

BonPause

AonCreate

AonStart

AonResume

BonStop

2)这时候如果在ActivityB这个界面上点击返回键,我们会得到如下内容:

BonPause

AonRestart

AonStart

AonResume

BonStop

BonDestroy

3)这时候如果在ActivityB这个界面上点击Home键,我们会得到如下内容:

BonPause

BonStop



这些如果都能理解的话,Activity的生命周期已经基本清楚了。但是还没有结束,下面要介绍一下Activity的加载模式,这些加载模式会影响Activity的生命周期。

Activity有四种加载模式:

standard:标准模式,一调用startActivity()方法就会产生一个新的实例。
singleTop:
如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
singleTask:
会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
singleInstance:
这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。

一般情况下,“standard”和”singleTop”activity的目标task,和收到的Intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个Task中。除非Intent包括参数FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。
“singleTask”
和”singleInstance”总是把要启动的activity作为一个task的根元素,他们不会被启动到一个其他task里。

介绍完Activity的加载模式,可以顺便提下android里应用和任务。


Application就是一个应用,这个应用就是android系统里apk格式的应用。一个应用由一个或者多个activity组成,application有四大组件。

Task是一个任务,实际上我们可以把它认为是一个activity的栈,比如我们有三个activityFirstActivitySecondActivity,ThirdActivity,当点击FirstActivity的时候跳转至SecondActivity,当点击SecondActivity的时候,跳转至ThirdActivity,当点击ThirdActivity的时候,跳转至发短信的界面。这样,这三个Activity以及发短信的界面便构成了一个Task,也就是一个Activity栈,这些Activity的顺序已经定死,当用户点击返回键的时候,便会按照Activity的出栈顺序进行弹出。

OK,下面再看下上面的那个例子。如果我们将ActivityA的启动模式设置为singleTask的话,上面(2),(1)的执行结果会是什么呢?先看(2).

BonPause

AonRestart

AonStart

AonResume

BonStop

BonDestroy

我们发现这没有什么变化,Activity的加载模式对返回键的处理是没有影响的。那么(1)呢?

BonPause

AonRestart

AonStart

AonResume

BonStop

这时候我们发现变化了:ActivityA不再执行onCreate了,直接执行了onReatart方法。就是说如果我们将ActivityA的加载模式设置为singleTask的话,如果它已经启动,则不会再创建这个Activity了,而是从保存的状态里

直接reStart了。

这里我只是举了一个singleTask的例子,其他的加载模式有兴趣的话可以自己再试。另外,不同任务的情况

也会对Activity的生命周期产生影响,这些都应该是开发过程中需要注意的问题。

以上是一些拙见,有问题可以交流。



你可能感兴趣的:(深入理解Android Activity生命周期)