Activity是Android四大组件之一,大多数Android应用都有若干个Activity。在C++或者java程序中,应用是通过main()方法启动的,但是Android系统不同,它会调用生命周期特定阶段对应的回调方法启动Activity。
Activity有下面七个生命周期回调方法:
onCreate()
这个回调方法必须实现,它会在系统创建Activity的时候触发。通常在此方法中,需要初始化Activity的基本组件,比如创建视图以及绑定数据列表。在此方法中,调用setContentView()方法定义该Activity的布局。
onStart()
完成onCraete()方法后,Activity对用户可见,进入已启动状态。
onResume()
此回调方法会在Activity与用户进行交互之前调用,此时,Activity位于栈顶,一个Activity的大部分核心功能都是在onResume()中实现的。
onPause()
当Activity失去焦点并且进入已暂停状态,就会调用onPause()方法。此时,Activity可能可见,如切换页面或者分屏显示的时候。可以理解为用户正在离开该Activity。当onPause()执行完毕后,视情况将回调onStop()或者onStart()方法。下面是一些调用onPause()的情况:
- 当某个事件中断应用执行(最常见)。
- 在 Android 7.0(API 级别 24)或更高版本中,有多个应用在多窗口模式下运行。无论何时,都只有一个应用(窗口)可以拥有焦点,因此系统会暂停所有其他应用。
- 有新的半透明 Activity(例如对话框)处于开启状态。只要 Activity 仍然部分可见但并未处于焦点之中,它便会一直暂停。
onStop()
当Activity对用户不可见时,会调用onStop()方法。当Activity被销毁或者现有Activity被其他Activity覆盖,都会对用户不可见。如果Activity重新与用户交互,下一个回调就是onReStart();如果Activity彻底被销毁,下一个回调就是onDestroy()。
onRestart()
当处于已停止状态的Activity即将重新启动时,系统会执行此回调方法,当执行完成,Activity会回到停止时的状态。
onDestroy()
在销毁Activity之前会执行此回调。实现onDestroy()是为了确保销毁Activity或者销毁所在进程的时候释放资源。
生命周期示意图
生命周期演示
在Activity的每一个生命周期回调中打印log:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivityLifecycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate");
}
//生命周期函数
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart");
}
}
启动程序时
E/MainActivityLifecycle: onCreate
E/MainActivityLifecycle: onStart
E/MainActivityLifecycle: onResume
此时会依次执行onCreate、onStart、onResume方法,Activity可以进行交互。
切换应用时(未选择其他应用)
E/MainActivityLifecycle: onPause
E/MainActivityLifecycle: onStop
此时,将依次调用onPause以及onStop方法,此时用户不可以与Activity进行交互。接着,返回到原应用,则会调用以下方法:
E/MainActivityLifecycle: onRestart
E/MainActivityLifecycle: onStart
E/MainActivityLifecycle: onResume
使得Activity重新可以进行交互。而如果不返回原应用,而是删除该Activity对应应用的任务,则会调用以下方法:
E/MainActivityLifecycle: onDestroy
销毁该Activity。此时,Activity的七个生命周期回调都经历了。
分屏显示时
在 Android 7.0(API 级别 24)或更高版本中,可以有多个应用在多窗口模式下运行。这里,我们同时允许两个应用分屏,此时,焦点在MainActivity中,当点击另外一个应用时:
E/MainActivityLifecycle: onPause
这里,不会调用onStop,因为MainActivity对我们完全去可见,只是失去了焦点而已。当重新点击MainActivity时执行以下方法:
E/MainActivityLifecycle: onResume
也即使焦点重新回到MainActivity。