0%

Activity生命周期

Activity状态

Activity 生命周期是指 Activity 从创建销毁的过程,在这一过程中,Activity 一般处于4种状态,即Active/Running、Paused、Stop、Killed。

  1. Active/Running。此时 Activity 一定处于屏幕的最顶端,可以被看到,并且可以与用户进行交互。对于 Activity 栈来说,它处于栈顶
  2. Paused。此时 Activity 在屏幕上仍然可见,但它已经失去了焦点,用户不能与之交互。处于暂停的 Activity 仍然是存活的,它仍然维持着其内部的状态的信息,但是系统可能会在内存不足时杀死该 Activity。
  3. Stop。此时 Activity 在屏幕上不能被用户所见,即该 Activity 被其它 Activity 所遮盖。同 Paused 状态类似,处于停止状态的 Activity 仍然保留着其内部的状态和成员信息,但是会由于手机系统内存被征用而被系统杀死回收。
  4. Killed。Activity 被系统杀死回收或未启动。

生命周期的事件回调函数

函数 描述 可被杀死 下一个
onCreate() 当 Activity 第一次被创建时调用 onStart()
onRestart() 当 Activity 停止后,再次启动前调用 onStart()
onStart() 当 Activity 正要变得为用户所见时被调用
当 Activity 转向前台时继以 onResume()
当 Activity 变为隐藏时继以 onStop()
onResume()
onStop()
onResume() 当 Activity 开始与用户进行交互前被调用
此时 Activity 位于堆栈顶部,用户可见。继以 onPause()
onPause()
onPause() 当系统将要启动另一个 Activity 或者弹出对话框时调用
此方法会将所有持久性数据写入存储中,下一个 Activity 必须待其完成才能继续
当 Activity 重新回到前台时继以 onResume()
当 Activity 变为用户不可见时继以 onStop()
onResume()
onStop()
onStop() 当 Activity 不再为用户可见时调用
这可能发生在它被销毁或者另一个 Activity (可能是现存或新建的)回到运行状态并覆盖它时
如果 Activity 再次回到前台跟用户交互则继以 onRestart()
如果关闭 Activity 则继以 onDestory()
onRestart()
onDestory()
onDestroy() 在 Activity 销毁前调用
这可能发生在 Activity 结束(调用它的 finish() 方法)或者因为系统需要临时空间而销毁该 Activity 实例时
可以用 isFinishing() 来区分这两种情况

注:表格中“可被杀死”一列是指在该方法被调用后,系统是否可以杀死包含此 Activity 的进程。


为了获取 Activity 被杀死前的状态,可以在 Activity 被销毁前使用 onSaveInstanceState() 方法。

它会将一个键值对方式记录的 Activity 动态状态的 Bundle 对象传递给该方法。

而当 Activity 再次启动时,这个 Bundle 会传递给 onCreate() 方法或随着 onStart() 方法调用的 onRestoreInstanceState(),所以它们两个都能恢复之前保存的状态。

方法 描述 是否可终止
onSaveInstanceState() Android 系统因资源不足而终止 Activity 前被调用,用以保存 Activity 的状态信息
供 onCreate() 和 onRestoreInstanceState()方法恢复使用
onRestoreInstanceState() 恢复 onSaveInstanceState() 保存的 Activity 状态信息
在 onStart() 和 onResume() 方法之间使用

实例

Android 界面如下,当前是在 Activity1 下。

点击 “进入Activity2”,此时先调用了 onPause() ,Activity1 先进入Paused状态,然后再调用onCreate() -> onStart() -> onResume() ,此乃创建 Activity 三件套。然后 Activity1 调用 onStop() 转向后台,onSaveInstanceState() 保存状态信息。

1
2
3
4
5
6
E/Activity1: onPause
E/Activity2: onCreate
E/Activity2: onStart
E/Activity2: onResume
E/Activity1: onStop
E/Activity1: onSaveInstanceState

随即点击“进入 Activity1 ”回到主界面,与上面情况类似,是先暂停 Activity2,而后创建 Activity1,在保存 Activity2 的状态信息。

1
2
3
4
5
6
E/Activity2: onPause
E/Activity1: onCreate
E/Activity1: onStart
E/Activity1: onResume
E/Activity2: onStop
E/Activity2: onSaveInstanceState

但如果使用的是物理按键,则是重启 Activity1,然后把 Activity2 销毁

1
2
3
4
5
6
E/Activity2: onPause
E/Activity1: onRestart
E/Activity1: onStart
E/Activity1: onResume
E/Activity2: onStop
E/Activity2: onDestroy

最后我们尝试一下点击“进入 Activity3 ”,会跳出一个对话框,此时 Activity1 还是可见的。

因此是没有 onStop() (停止 Activity)和 onSaveInstanceState() (保存 Activity 状态信息)这一步的。

1
2
3
4
E/Activity1: onPause
E/Activity3: onCreate
E/Activity3: onStart
E/Activity3: onResume

点击对话框外面关闭该对话框,是先暂停 Activity3,随即 Activity1 调用 onResume(),使得它可以与用户进行交互,最后停止并销毁 Activity3。

1
2
3
4
E/Activity3: onPause
E/Activity1: onResume
E/Activity3: onStop
E/Activity3: onDestroy