Activity生命周期
一、初步了解
Activity是由栈管理的,但是为避免问题复杂化,我们可以暂时将所有的Activity当成在一个栈中管理,它遵循先进先出原则,每一个新生成的Activity都会被压入栈中。
-
一个activity生命周期,大体可以分为四个状态:
-
1、前台运行:Activity在栈顶,并在屏幕最前方;
2、切换暂停:Activity不在栈顶,但是有部分或全部显示 ( 例如栈顶Activity透明或未完全覆盖屏幕 );
3、后台停止:Activity不再栈顶,并完全不可见;
4、程序销毁:Activity被人为结束或者因系统原因(内存不足等)被GC回收;
二、进一步深入
-
详细的生命周期入如下图:
1、onCreate():正在创建Activity,进行界面资源加载,初始化Activity所需要的各种数据,此时Activity对用户不可见;
2、onStart():正在启动Activity,此时Activity仍在加载内容,正准备显示界面,无法获取焦点,不能与用户交互;
3、onResume():完成创建Activity,界面对用户可见,且可以触发事件,能与用户进行交互;
4、onPause():暂停Activity活动,此时界面对用户部分或全部(如被透明界面覆盖)可见,但是无法进行交互;
5、onStop():停止Activity活动,此时界面对用户不可见;
6、onDestroy():销毁Activity,销毁所有视图;
7、onRestart():重启Activity,重新加载视图;
-
注意:
-
onStart():Activity还未完全显示,不能参与用户交互;
onResume():Activity可见,可以参与用户交互;
onPause():
(1)、不推荐在这里做耗时操作,这可能导致界面的跳转或恢复变得不流畅(因为所有的再显示操作都需要执行onResume()方法,但是这个方法会等待onPause()方法执行完毕—-哪怕是跳转到新的Activity,他也会等待当前Activity的onPause()方法执行完毕),反而推荐在这里进行一些次要资源的释放,如动画的停止等;
(2)、在这个状态下如果切换回原Activity,它会直接调用onResume()进行界面显示,即onPause() —> onResume();onStop():
(1)、在某些极端条件下,这个方法可能不被执行,同理,onDestroy()也是一样(直接被用户杀死);
(2)、在这个状态切换会原Activity,他会先调用onRestart(),然后调用onStart(),最后调用onResume()进行界面显示,即onStop() —> onRestart() —> onStart() —> onResume();
三、知识补充
-
1、Activity的四种模式
-
- standard:标准启动模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在,此时 onCreate()、onStart()、onResume() 都会执行;
- singleTop:栈顶复用模式,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,而是直接复用栈顶的实例,此时 onCreate()、onStart()、onResume()不会会执行,而且Activity的onNewIntent()方法会被回调,如果Activity已经存在但是不在栈顶,那么就会与standard模式一样;
- singleTask:栈内复用模式,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶复用,并且singleTask会清理在当前Activity上面的所有Activity,此时Activity的onNewIntent()方法会被回调;
- singleInstance:这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了
注意:在xml中使用android:launchMode=”standard|singleInstance|singleTask|singleTop”设置这些模式
-
2、Activity的数据恢复
-
- onSaveInstanceState():当Activity存在被回收销毁的可能的时候,这个方法会被调用(用户主动销毁除外),该方法中有一个Bundle参数,可以使用putString()、putInt()等方法进行数据保存,onCreate也有一个Bundle类型的参数,这之后可以在onCreate中恢复。
- 下面是系统几种可能调用onSaveInstanceState()的情况:
(1)、按HOME键
(2)、在历史记录中选择其他应用程序
(3)、熄屏的时候
(4)、屏幕切换的时候(横竖屏切换等,未指定configchange的情况下) - onRestoreInstanceState():当Activity确实被系统销毁(非用户主动销毁)之后调用;
注意:
- onSaveInstanceState()和onRestoreInstanceState()并不是非得成对使用的;
- onSaveInstanceState()在onStop()之前调用,而onRestoreInstanceState()在onStart()之后调用;
- 两者在使用时都记得调用父类super方法
例子
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在Acivity是第一次被创建的时候这里为空,因此需要判断一下
if( savedInstanceState != null ){
savedInstanceState.getString("name");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("name","Tom");
super.onSaveInstanceState(outState);
}
}