概述
Activity生命周期分为六个核心回调方法:onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。 Activity 进入新状态时,系统会触发调用其中每个回调方法。
Activity启动流程以及用户操作(切换到其他app或者点击Home按键)的核心回调流程图(来自google文档):
onCreate
代码中必须实现的回调方法,当Activity首次被创建时触发,Activity在创建后会进入“已创建”状态。在 onCreate() 方法中,需要加入基本的应用启动代码,onCreate内的代码在 Activity 的整个生命周期中只会执行一次。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//指定XML布局文件
Log.d(LOG_TAG,"onCreate");
}
将已定义好的 XML文件作为参数传递给setContentView(),还可以在Activity代码中新建自定义的View对象,并将创建好的View添加到ViewGroup,然后将ViewGroup作为参数传递给setContentView()。
onCreate() 方法完成执行后,Activity进入“已开始”状态,随后会相继调用 onStart() 和 onResume() 方法。
onStart
当 Activity 进入“已开始”状态时,系统会调用此回调。onStart() 调用使得 Activity 对用户可见,可以通过此方法执行初始化界面的代码。
onStart() 方法会非常快速地完成,与“已创建”状态一样,Activity 不会一直处于“已开始”状态。一旦此回调结束,Activity 便会进入“已恢复”状态,系统将调用 onResume() 方法。
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG,"onStart");
}
onResume
Activity在进入“已恢复”状态时来到前台,然后系统调用 onResume() 方法。“已恢复”状态是与用户互动的状态。应用会一直保持这种状态,直到某些事件(比如接到来电、用户被引导启动到另一个 Activity,或设备屏幕关闭,等等)发生,使得应用失去焦点。
同样,当Activity 进入“已恢复”状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_RESUME 事件。
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG,"onResume");
}
当发生中断事件时,Activity 进入“已暂停”状态,系统调用 onPause() 回调。如果Activity 从“已暂停”状态返回“已恢复”状态,系统将再次调用 onResume() 方法。
onPause
此方法为用户将要离开 Activity 的第一个标志,并且表示Activity不再位于前台(包括多窗口模式时Activity仍然可见),使用 onPause() 方法暂停或调整Activity 处于“已暂停”状态时不应继续或有节制地继续的操作,以及我们希望很快恢复的操作。
当 Activity 进入已暂停状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_PAUSE 事件。
@Override
protected void onPause() {
super.onPause();
//可以释放资源或者传感器、暂停不需要的用户操作以节省电量
Log.d(LOG_TAG,"onPause");
}
onPause() 执行非常简单,因此不应该使用 onPause() 来保存应用或用户数据、进行网络调用或执行数据库事务。因为在该方法完成之前,可能无法完成上述操作。
onStop
Activity 不再对用户可见,说明其已进入“已停止”状态,因此系统将调用 onStop() 回调。例如,当新启动的Activity覆盖整个屏幕时,可能会发生这种情况。
当 Activity 进入已停止状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_STOP 事件。
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG,"onStop");
}
在 onStop() 方法中,应释放或调整在应用对用户不可见时的无用资源。例如,可以暂停动画效果,或从精确位置更新切换到粗略位置更新。使用 onStop() 而非 onPause() 可确保与界面相关的工作继续进行,即使在多窗口模式下查看 Activity 也能如此。
进入“已停止”状态后,Activity 要么返回与用户互动,要么结束运行并消失。如果 Activity 返回,系统将调用 onRestart()。如果 Activity 结束运行,系统将调用 onDestroy()。
onDestroy
销毁 Ativity 之前,系统会先调用 onDestroy()。系统调用此回调的原因如下:
- Activity 即将结束(由于用户彻底关闭 Activity 或由于系统为 Activity 调用 finish()),或者
- 由于配置变更(例如设备旋转或多窗口模式),系统暂时销毁 Activity
当 Activity 进入已销毁状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_DESTROY 事件。
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG,"onDestroy");
}
执行log如下:
首次启动:
2020-08-18 14:39:39.171 17120-17120/com.example.myactivity D/MyActivity: onCreate
2020-08-18 14:39:39.175 17120-17120/com.example.myactivity D/MyActivity: onStart
2020-08-18 14:39:39.176 17120-17120/com.example.myactivity D/MyActivity: onResume
点击home键:
2020-08-18 14:40:18.172 17120-17120/com.example.myactivity D/MyActivity: onPause
2020-08-18 14:40:18.711 17120-17120/com.example.myactivity D/MyActivity: onStop
2020-08-18 14:40:18.718 17120-17120/com.example.myactivity D/MyActivity: onDestroy