Activity的生命周期
平时开发过程中大家习惯将一些初始化方法或者销毁资源的方法写在activity的生命周期方法中,那么今天就来重新再学习下activity的生命周期。
首先惯例上一张官网的生命周期简化说明图
这张图上很清楚的表明了这些生命周期的调用顺序。在实际的开发过程中我们可能不需要去重写每一个方法,但是理解每一个方法意义和用途是至关重要的。
onCreate()
必须实现的一个方法,当系统创建Activity的时候就执行此方法,在整个生命周期中只执行一次,可以在里面执行一些数据绑定等操作。完成onCreate()方法后,Activity进入到启动状态,接下来将快速的调用onStart()和onResume()方法
onStart()
Activity进入到启动状态的时候,系统将会调用此方法,使Activity对用户可见。
onResume()
activity进入到前台,进入到onResume()方法之后,程序会一直保持这个状态,直到有其他的应用进入到前台
onPause()
当activity不在前台的时候调用此方法,比如有电话进来或者其他活动。在多窗口模式中,只要activity部分可见且不在焦点中,就会处于此状态
onStop()
调用此方法的时候activity对用户不可见。可以在此方法中释放或者调整不需要的资源,或者可以对一些信息进行持久化操作。
onDestory()
在销毁Activity之前调用的方法,调用finish()或者由于配置更改(如设备旋转或多窗口模式),系统暂时销毁Activity。这里要释放掉所有资源。
其实关于“可见”和“前台”一直疑问,应该是activity在前台的时候一定可见,但可见不一定在前台,“可见”可以理解为activity已经加载出来了,但是有可能被其他的页面覆盖掉处于后台状态(来自android 开发艺术探索)比如activity可见,但是被dialog覆盖,这个时候应该是认为可见但不在前台
Activity的异常生命周期
上面说完了Activity正常的生命周期,下面来看下Activity被异常终止的情况。
Activity配置改变
比如activity横竖屏的改变,语言的改变
Activity 中有两个方法,分别是onSaveInstanceState和onRestoreInstanceState,其中onSaveInstanceState的作用是Activity异常销毁时,会存储数据,当再次启动这个activity的时候,会从onRestoreInstanceState方法中拿到之前存储的数据,当然也可以从onCreate中拿到数据,但是这里注意需要判空,推荐使用onRestoreInstanceState,下面看下代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
if (savedInstanceState != null) {
String s = savedInstanceState.getCharSequence("save_state", "").toString();
Log.d(TAG, "onCreate: " + s);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putCharSequence("save_state", "保存的数据");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String s = savedInstanceState.getCharSequence("save_state", "").toString();
Log.d(TAG, "onRestoreInstanceState: " + s);
}
看下log:
2019-04-02 21:47:13.153 3471-3471/com.example.myapplication D/LoginActivity: onCreate: 保存的数据
2019-04-02 21:47:13.165 3471-3471/com.example.myapplication D/LoginActivity: onRestoreInstanceState: 保存的数据
注意这里的onSaveInstanceState方法只是保存临时数据,不能做数据的持久化
Activity的启动模式
首先来说下,Activity的启动模式一共有四种,分别是standard、singleTop、singleTask、singleInstance,我们都知道一个App中会有很多Activity ,这些Activity都是放在栈里面的,栈是一种数据结构,遵循着先进后出的原则,也就是说我们当前看到的Activity是在栈顶的,我们按下返回键就会将这个Activity从栈顶弹出。Activity的启动模式我们可以再AndroidManifest.xml进行配置,合理的利用Activity的启动模式有时候会给我们开发带来很多便利。
standard
这种模式使我们开发中最常见的,我们不用在清单文件中声明,默认的就是这种启动模式。在这种模式下,每当你启动一个activity,不管栈中有没有这个activity的实例,系统都会去重新创建一个activity的实例,也就是说这种模式下允许activity有多个实例。
singleTop
栈顶复用模式,也就是说当activity使用这种模式的时候,处于栈顶的activity不会被重建,也就是说不会走onCreate,onStart方法,但是会调用onNewIntent方法。注意如果这个activity如果不处于栈顶,那么这个activity依然会被重建
singleTask
栈内复用模式,单实例模式,只要activity在一个栈中存在,那么就不会创建这个activity,多次启动这个activity的时候也会调用onNewIntent方法。
singleInstance
顾名思义,这是一种单实例模式,其实这种模式除了拥有singleTask所有特性之外,还有一个特点就是只能单独的存在一个栈中
这只是一个概括,后续遇到问题再补充吧。。。。。