Activity生命周期
返回栈
- 运行状态:位于返回栈栈顶
- 暂停状态:不在栈顶但仍然可见,例如对话框的出现
- 停止状态:不在栈顶且完全不可见,但系统仍保留该活动的成员变量和相应的状态
- 销毁状态:被移除返回栈
生命周期
在活动第一次被创建时调用。
在活动由不可见到可见时调用。
在活动准备与用户进行交互时调用,此时活动必须位于栈顶并且处于运行状态。
在该Activity失去焦点但未被完全覆盖,系统准备去启动或恢复另一个活动时调用,通常会在该方法中释放一些消耗CPU的资源,以及保存一些重要数据。
在活动完全不可见时调用。不同于onPause的是若新活动是以对话框的形式启动的那么该活动只会执行onPause方法。
在活动被销毁之前调用。
在活动由停止状态变为运行状态之前调用。
需要特别注意的是:
当从activity1跳转到另一个activity2时,会先执行activity1的onPause方法,再执行activity2的onResume方法
以上七种又可归纳为:
完整生存期:onCreate()和onDestroy()之间
可见生存期:onStart()和onStop()之间
前台生存期:onResume()和onPause()之间
防止活动被回收导致信息丢失:
一个活动若处于停止即onPause状态是有可能被系统回收的。
但当系统回收活动时会调用 onSaveInstanceState(Bundle) 回调方法。
该方法提供一个Bundle类型参数,可通过Bundle保存数据。
然后在其它活动的onCreate方法中的Bundle类将它取出来。
异常情况下的生命周期
onSavaInstanceState会在onStop被调用前调用,但可在onPause被调用前调用也可以在onPause被调用后调用,同时用户主动销毁不会调用,例如当用户点击回退键或者调用了 finish() 方法, 不会调用该方法。
在Activity被重建时系统会调用onRestoreInstanceState(在onStart后,在onResum前),并且onSavaInstanceState会把保存了数据的Bundle分别传给onCreate和onRestoreInstanceState。
屏幕旋转
屏幕旋转会导致Activity异常情况下重建Activity
1 | //切屏会重新调用各个生命周期,切横竖屏只会执行一次 |
创建layout-land文件夹,在此文件夹中新建test-land.xml,则若屏幕旋转为横屏时便会自动载入test-land.xml中的布局内容
注意
onSavaInstanceState只有在activity异常销毁时才会被调用。
Activity的启动模式
1 | <activity android:name=".MainActivity" android:launchMode="standard"> |
standard
标准模式,是系统的默认模式。每次启动一个Activity都会新创建一个实例,不论该实例原先是否存在
该模式规定如果A启动了B,则B会进入到A所在的栈中,因此当B不存在任务栈的C启动后,后报错,解决方法为:
1 | intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) |
singleTop
栈顶复用模式,此模式规定当新Activity已存在任务栈的栈顶则不会创建新的实例
此时方法onNewIntent方法会被调用,但onCreate和onStart方法不会被调用
singleTask
栈内复用模式,是一种单实例模式,该模式规定只要任务栈中存在该Activity就不会创建新实例
当任务栈中不存在该Activity,则创建一个Activity实例并放入到任务栈栈顶。如果存在,则将该Activity移到栈顶,并调用onNewIntent方法
singleInstance
单实例模式,拥有singleTask的所有特性,但每一个Activity都在单独存在于一个栈。
v1.5.2