天天看点

Android中Activity的生命周期【详】

Android中Activity的生命周期分为正常情况下和异常情况下两种。

【一】Activity正常情况下的生命周期

正常情况下的生命周期是activity与用户交互的过程中产生的生命周期的改变。
           

在这种情况下,activity生命周期的变化如下:

onCreate()

——代表当前activity正在被创建

onRestart()

——代表当前activity正在被重新启动,这种情况下,activity从不可见变为可见状态,此方法一般在activity被重新调起时会调用。

onStart()

——表示activity正在被启动,即将开始,这个时候activity已经是可见的了,但是还没有进入前台,无法与用户进行交互。

onResume()

——表示activity已经出现在前台,并且可以与用户交互了

onPause()

——表示activity正在停止,正常情况下,

onstop

方法会接着调用,这个时候可以做一些不耗时的轻量级操作。

onStop()

——表示activity即将停止,可以做一些稍微重量级的操作,但是还是不能太耗时。

onDestroy()

——表示activity即将销毁,此时可以做一些资源回收释放的工作。

Android中Activity的生命周期【详】
  1. 针对一个特定的activity,第一次启动时生命周期的回掉如下:

    onCreate

    ->

    onStart

    ->

    onResume

    ;
  2. 当用户打开一个新的activity或切换到其他页面时,回掉如下:

    onPause

    ->

    onStop

    ,在这里,当新的activity使用的透明主题时,当前activity仅仅只回掉onPause方法;
  3. 当用户重新回到原activity时,回掉如下:

    onRestart

    ->

    onStart

    ->

    onResume

    ;
  4. 当用户按back键时,activity销毁,回掉如下:

    onPause

    ->

    onStart

    ->

    onDestroy

    ;
        在这里要说下

activity

中两个

activity

切换时,必定会先回掉前一个

activity

onPause

方法后才会启动新的

activity

,故而绝对不能在

onPause

方法中执行耗时操作。

【二】Activity异常情况下的生命周期

异常情况下的生命周期是指Activity在被系统回收或当前设备的配置发生改变时,activity销毁重建时生命周期的改变。
           
如果activity不做特殊处理的话,当系统配置发生改变或被系统回收后,activity就会被销毁并重新创建,其生命周期如下图:
           

销毁时的生命周期:

重新创建时的生命周期:

因为

activity

是异常终止的,系统会调用

onSaveInstanceState

方法来保持当前

activity

的状态,这个方法的调用在

onStop

方法调用之前。

activity

重新创建的时候,系统会调用

onRestoreInstanceState

方法,并将

activity

销毁时保存的Bundle对象传递给

onRestoreInstanceState

onCreate

方法,当然了,

onRestoreInstanceState

方法的调用也必须在

onStart

方法之后。

而因为系统内存不足导致Activity被杀死,其数据存储和恢复过程与上面的一致。至于Activity被杀死,就要涉及到activity的优先级了,activity的优先级可以分为以下三种:
1. 前台activity ------正在和用户交互的activity,优先级最高
2. 可见但非前台的activity ------比如Activity上弹出一个对话框,使得Activity位于后台,不可与用户交互,但可见
3. 后台Activity ------已经被暂停的Activity,优先级
           

Activity的启动模式

1. Activity 的LaunchMode

    Android中activity的启动模式目前有四种:

standard

singleTop

singleTask

,

singleInstance

  1. standard

    标准模式,也就是系统默认的启动模式,每次启动一个Activity都会重新创建一个activity实例,不管是否有这个实例。

    需要注意的是standard模式的Activity默认会进入启动它的activity的栈内,因为contextt不存在栈,所以用ApplicationContext去启东standard模式的Activity会报错,解决方法是给待启动的Activity指定一个标记位Flags。

  2. singleTop

    栈顶复用模式,这种模式下,只要activity实例位于任务栈的栈顶,则不会重新创建实例,同时会回调onNewIntent方法,通过此方法的参数我们可以取出当前请求的信息。

    如果新Activity的实例已经存在,但不在栈顶,依然会重新创建实例。

    需要注意的是如果没有重新创建实例,activity的onCreate和onStart方法并不会重新调用。

  3. singleTask

    栈内复用模式,这是一种单实例模式。只要Activity的实例在一个栈中存在,就不会重新创建实例,如果当前Activity的实例不在栈顶的话,系统会移除这个实例上面的所有实例,并调用onNewIntent方法;否则重新创建一个实例压入栈顶。

  4. singleInstance

    单实例模式,这是一种加强singleTask模式,除了具备singleTask的所有特性意外,singleInstance模式的activity只能单独的位于一个任务栈中。

    需要注意的是由于栈内复用的缘故,除非这个任务栈被系统销毁,否则不会重新创建

至于如何给activity指定启动模式,共有两种方法。当然了,两种方式还是有一定区别的,首先是优先级上,第二种的优先级明显高于第一种方式,其次第一种方式不能直接为Activity指定FLAG_ACTIVITY_CLEAR_TOP标识,第二种方式不能指定singleInstance模式

第一种是通过AndroidMenifest.xml清单文件给Activity指定启动模式

<activity 
        android:name=".activity.ViewPagerActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop"/>
           

第二种是在代码中通过Intent设置标记位了指定启动模式。

intent.setClass(getApplicationContext(),HttpClientActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
           

2. Activity的Flags

Activity的flags有很多,这里主要分析一些常见的Flags。

1. FLAG_ACTIVITY_NEW_TASK  这个标记为相当于singleTask启动模式

2. FLAG_ACTIVITY_SINGLE_TOP  这个标记位相当于singleTop启动模式

3. FLAG_ACTIVITY_CLEAR_TOP  这个标记位一般和singleTas模式一起出现;如果Activity采用standard模式,那么连同他以及他之上的实例都要出栈,系统会创建新的实例放入栈顶。

4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENETS  具有这个标记位的activity不会出现在已经存在的历史Activity列表,通常在我们不希望用户回退到Activity的时候使用。他等同于android:excludeFromRecents="true"属性。