Activity从创建到销毁,在整个的生命周期中的不同阶段调用7个生命周期方法,所有回调方法都可以重写,使得在 Activity 状态发生变化时执行相应操作。 以下框架 Activity 包括每一个基本生命周期方法:
public class ExampleActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // The activity is being created. } @Override protected void onStart() { super.onStart(); // The activity is about to become visible. } @Override protected void onResume() { super.onResume(); // The activity has become visible (it is now "resumed"). } @Override protected void onPause() { super.onPause(); // Another activity is taking focus (this activity is about to be "paused"). } @Override protected void onStop() { super.onStop(); // The activity is no longer visible (it is now "stopped") } @Override protected void onDestroy() { super.onDestroy(); // The activity is about to be destroyed. } } |
下图说明了Activity在状态转变期间可能经过的路径。矩形表示回调方法。
从图中,我可以看到Activity 生命周期中的有三个嵌套循环:
- Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),在onDestroy() 中的释放所有其余资源。例如,如果Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。
- Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop()。可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
- Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台,例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。
下面详细描述每个回调的方法。
1、onCreate
首次创建 Activity 时调用。 您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态(请参阅后文的保存 Activity 状态)。
始终后接 onStart()。
2、onRestart()
在 Activity 已停止并即将再次启动前调用。
始终后接 onStart()
3、onStart
在 Activity 即将对用户可见之前调用。
如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()。
4、onResume
在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。
始终后接 onPause()。
5、onPause()
当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。
如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。
当其他高优先级的应用需要内存时,可能会到导致onPause终止App的进程
6、onStop()
在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。
如果 Activity 恢复与用户的交互,则后接 onRestart(),如果 Activity 被销毁,则后接 onDestroy()。
7、onDestroy()
在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。
当 Activity 结束(有人对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。
下面给出上述触发上述事件的常见时机。
- 启动 Activity,依次触发onCreate()--->onStart()--->onResume()这三个方法;
- 启动Activity后,点击返回键,依次触发onPause()--->onStop()--->onDestory()这三个方法;
- 启动Activity后,点击Home键,依次触发onPause()--->onStop()这两个方法;
- 启动Activity后,旋转屏幕,依次触发onPause()--->onStop()--->onDestory()-->onCreate()--->onStart()--->onResume(),这六个方法。
- 在Activity1中启动Activity2,依次触发Activity1的onPause()--->onStop()这两个方法,触发Activiy2的onCreate()--->onStart()--->onResume(),
- 点击返回键,从Activity2返回到Activity1,依次触发Activity2的onPause()--->onStop()--->onDestory()这三个方法,触发Activity1的onRestart()--->onStart()--->onResume();
注意的是,当我们通过最近使用的应用列表关闭APP时,onDestroy的执行表现出非常的不确定性,通常Activity栈里面只有一个Activity时,不会触发onDestory,如果有多个Activity,只会触发第一个Acitivy的onDestory,关于Activity栈的后面会有介绍,请大家在实际操作中注意。
onPause()、onStop() 和 onDestroy()这三个方法返回都有可能随时终止承载 Activity 的进程。 onPause() 是这三个方法中的第一个,因此 Activity 创建后,onPause() 必定成为最后调用的方法,然后才能终止进程( 如果系统在紧急情况下必须恢复内存,则可能不会调用 onStop() 和 onDestroy())。因此,您应该使用 onPause() 向存储设备写入至关重要的持久性数据(例如用户编辑)。不过,您应该对 onPause() 调用期间必须保留的信息有所选择,因为该方法中的任何阻止过程都会妨碍向下一个 Activity 的转变并拖慢用户体验。
(张伟:2018年10月27日)
(转载时请注明来源)