Android中Activity的生命周期分为正常情况下和异常情况下两种。
【一】Activity正常情况下的生命周期
正常情况下的生命周期是activity与用户交互的过程中产生的生命周期的改变。
在这种情况下,activity生命周期的变化如下:
onCreate()
——代表当前activity正在被创建
onRestart()
——代表当前activity正在被重新启动,这种情况下,activity从不可见变为可见状态,此方法一般在activity被重新调起时会调用。
onStart()
——表示activity正在被启动,即将开始,这个时候activity已经是可见的了,但是还没有进入前台,无法与用户进行交互。
onResume()
——表示activity已经出现在前台,并且可以与用户交互了
onPause()
——表示activity正在停止,正常情况下,
onstop
方法会接着调用,这个时候可以做一些不耗时的轻量级操作。
onStop()
——表示activity即将停止,可以做一些稍微重量级的操作,但是还是不能太耗时。
onDestroy()
——表示activity即将销毁,此时可以做一些资源回收释放的工作。
- 针对一个特定的activity,第一次启动时生命周期的回掉如下:
->onCreate
->onStart
;onResume
- 当用户打开一个新的activity或切换到其他页面时,回掉如下:
->onPause
,在这里,当新的activity使用的透明主题时,当前activity仅仅只回掉onPause方法;onStop
- 当用户重新回到原activity时,回掉如下:
->onRestart
->onStart
;onResume
- 当用户按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
-
standard
标准模式,也就是系统默认的启动模式,每次启动一个Activity都会重新创建一个activity实例,不管是否有这个实例。
需要注意的是standard模式的Activity默认会进入启动它的activity的栈内,因为contextt不存在栈,所以用ApplicationContext去启东standard模式的Activity会报错,解决方法是给待启动的Activity指定一个标记位Flags。
-
singleTop
栈顶复用模式,这种模式下,只要activity实例位于任务栈的栈顶,则不会重新创建实例,同时会回调onNewIntent方法,通过此方法的参数我们可以取出当前请求的信息。
如果新Activity的实例已经存在,但不在栈顶,依然会重新创建实例。
需要注意的是如果没有重新创建实例,activity的onCreate和onStart方法并不会重新调用。
-
singleTask
栈内复用模式,这是一种单实例模式。只要Activity的实例在一个栈中存在,就不会重新创建实例,如果当前Activity的实例不在栈顶的话,系统会移除这个实例上面的所有实例,并调用onNewIntent方法;否则重新创建一个实例压入栈顶。
-
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"属性。