onCreate
表示Activity正在被创建,这是Activity 生命周期执行的第一个方法。可以做一些初始化的工作。
比如:加载布局文件、绑定控件、初始化数据等。
调用时机:Activity创建时调用,并且只会调用一次。
onStart
表示Activity正在被启动,此时Activity处于可见状态,但是还没有焦点,不能与用户进行交互。
源码中有这么一句话 drawing visual elements, running animations, etc.
翻译过来就是绘制视觉元素、运行动画等。
调用时机:紧跟onCreate()之后,Activity由不可见变为可见状态时调用。
onResume
表示Activity已经已经获得了焦点,可以与用户进行交互。
可以做一些刷新页面的操作,比如重新发送接口请求获取最新数据等。
调用时机:onStart之后,当Activity每次到前台时调用。
onPause
表示Activity已经失去焦点,不可与用户进行交互。
调用时机:当Activity回到后台时调用。
onStop
表示Activity已经完全不可见了。可以做一些停止的工作,比如暂停动画、暂停视频的播放、暂停banner的轮播等。
调用时机:当Activity不可见时候被回调。
onDestory
表示Activity已经被销毁,可以做一些回收的工作。比如 bitmap的回收,对象的置空,curosr的关闭等。
onRestart
表示Activity重新回到前台,接下来调用onStart、onResume。
调用时机:当Activity重新回到前台时回调。
流程图
此外还有两个特殊情况下会执行的生命周期onSaveInstanceState和onRestoreInstanceState。
将手机从竖屏切换到横屏时看下Activity执行的生命周期顺序。
再从横屏切换到竖屏看下Activity执行的生命周期顺序。
发现两次执行的生命周期是一致的。
按下Home键Activit的生命周期执行的顺序是这样的
再点击应用图标执行的生命周期是这样的
所以特殊情况下(屏幕旋转、按下home键盘) onSaveInstanceState是用来保存数据的,onRestoreInstanceState是用来恢复数据的。
看下代码
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState");
outState.putString(TAG,"保存的数据");
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
if(savedInstanceState != null){
Log.d(TAG,"拿到了"+savedInstanceState.getString(TAG));
}
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState");
Log.d(TAG, "拿到了"+savedInstanceState.getString(TAG));
}
打印信息:
可以看到正确保存和恢复了数据。
最后看一下当SecondActivity设置为singleTop启动模式,在SecondActivity点击跳转SecondActivity时,代码如下:
//点击跳转当前页面
Intent intent=new Intent(SecondActivity.this,SecondActivity.class);
intent.putExtra("SecondActivity","传递的数据");
startActivity(intent);
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent");
Log.d(TAG, intent.getStringExtra("SecondActivity"));
}
打印如下:
看到并没有执行onCreate()和onStart()而是执行了onNewIntent()并且拿到了传递过来的数据。
异常情况下(注这里的MainActivity无论设置哪种启动模式,下面的MainActivity执行的生命周期是一样的)
MainActivity跳转SecondActivity执行的生命周期
SecondActivity空指针报错闪退回到MainActivity执行的生命周期
MainActivity重新启动了,实际上是应用重新启动了。比正常进入MainActivity多执行了一个onRestoreInstanceState()方法,并且拿到了之前保存的值。
总结
Activity是安卓四大组件之一,其重要性不言而喻。掌握Activity的生命周期对日常开发有很大的帮助,另外本文也是面试官非常爱问的面试题。