Activity状态
Activity 生命周期是指 Activity 从创建
到销毁
的过程,在这一过程中,Activity 一般处于4种状态,即Active/Running、Paused、Stop、Killed。
- Active/Running。此时 Activity 一定处于屏幕的最顶端,可以被看到,并且可以与用户进行交互。对于 Activity 栈来说,它处于
栈顶
。 - Paused。此时 Activity 在屏幕上仍然
可见
,但它已经失去了焦点,用户不能与之交互。处于暂停的 Activity 仍然是存活的,它仍然维持着其内部的状态的信息,但是系统可能会在内存不足时杀死该 Activity。 - Stop。此时 Activity 在屏幕上不能被用户所见,即该 Activity 被其它 Activity 所
遮盖
。同 Paused 状态类似,处于停止状态的 Activity 仍然保留着其内部的状态和成员信息,但是会由于手机系统内存被征用而被系统杀死回收。 - 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 | E/Activity1: onPause |
随即点击“进入 Activity1 ”回到主界面,与上面情况类似,是先暂停 Activity2,而后创建
Activity1,在保存 Activity2 的状态信息。
1 | E/Activity2: onPause |
但如果使用的是物理按键◀,则是重启
Activity1,然后把 Activity2 销毁
。
1 | E/Activity2: onPause |
最后我们尝试一下点击“进入 Activity3 ”,会跳出一个对话框,此时 Activity1 还是可见的。
因此是没有 onStop() (停止 Activity)和 onSaveInstanceState() (保存 Activity 状态信息)这一步的。
1 | E/Activity1: onPause |
点击对话框外面关闭该对话框,是先暂停 Activity3,随即 Activity1 调用 onResume(),使得它可以与用户进行交互,最后停止并销毁 Activity3。
1 | E/Activity3: onPause |