# ActivityLeftCycleTest
**Repository Path**: mrfu/activity-left-cycle-test
## Basic Information
- **Project Name**: ActivityLeftCycleTest
- **Description**: 体验 Activity 的生命周期
- **Primary Language**: Kotlin
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-07-21
- **Last Updated**: 2021-07-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ActivityLeftCycleTest
#### 介绍
体验 Activity 的生命周期
1. 返回栈
2. Activity 状态
3. Activity 的生命周期
4. Activity 被回收了怎么办
#### 返回栈
Android 是使用任务栈来管理 Activity 的,一个任务就是一组存放在栈里的 Activity 的集合,这个栈被称为 **返回栈(back stack)**
栈是一种后进先出的数据结构,在默认的情况下,每当我们新启动了一个 Activity,它就会在返回栈中入栈,并处在栈顶的位置;而每当我们按下返回键或者调用了 finish() 方法去销毁一个 Activity 时,处于栈顶的 Activity 就会出栈,此时,前一个入栈的 Activity 就会重新处于栈顶的位置。
系统总是会显示处于栈顶位置的 Activity 界面给用户。
#### Activity 状态
每个 Activity 在其生命周期中最多可能会有 4 种状态
1. 运行状态: 当一个 Activity 处于返回栈的栈顶位置时,Activity 就处于运行状态
系统最不愿意回收这种状态下的 Activity
2. 暂停状态: 当一个 Activity 不再处于栈顶位置,但仍然可见时, Activity 就进入了暂停状态(如,弹出一个对话框时)
只有在内存极低的情况下,系统才会考虑去回收这种状态下的 Activity
3. 停止状态: 当一个 Activity 不再处于栈顶位置,并且完全不可见时,Activity 就进入了停止状态
当其他地方需要内存时,处于停止状态的 Activity 有可能会被i同回收
4. 销毁状态: 一个 Activity 从返回栈中移除后就变成了销毁状态
系统最愿意回收这种状态下的 Activity,以保证手机内存的充足
#### Activity 的生命周期

Android类中定义了 7 的回调方法,覆盖了 Activity 生命周期的每一个环节
1. **onCreate()** Activity 第一次创建时调用,且每一次创建只调用一次,可以在这个回调方法中完成 Activity 的初始化操作,如:加载布局,绑定事件等
2. **onStart()** Activity 由不可见变成可见时调用
3. **onResume()** Activity 准备好和用户进行交互时调用,此时一定位于返回栈栈顶位置,并且处于运行状态
4. **onPause()** 系统准备启动或者恢复另一个 Activity 时调用。通常会在这个方法中释放掉一些消耗 CPU 的资源,以及保存一些关键数据
5. **onStop()** Activity 完全不可见的时候调用,当新启动的 Activity 是一个对话框式的 Activity,onPause() 方法会执行,onStop() 方法不会执行
6. **onDestroy()** 这个方法会在 Activity 销毁之前调用,之后的 Activity 的状态就变成了销毁状态
7. **onRestart()** 这个方法在 Activity 由停止状态变为运行状态之前调用,此时 Activity 被重新启动了
同时,Activity 又可以分为 3 种生存期:
- **完整生存期**
Activity 在 onCreate() 方法和 onDestroy() 方法之间所有的经历就是完整生存期。在 onCreate() 方法中完成各种初始化操作,在 onDestroy() 方法中完成释放内存的操作
- **可见生存期**
Activity 在 onStart() 方法和 onStop() 方法之间所有的经历就是可见生存期。Activity 对于用户总是可见的,在 onStart() 方法中对资源进行加载,在 onStop() 方法中对资源进行释放,从而保证处于停止状态的 Activity 不会占用过多的内存
- **前台生存期**
Activity 在 onResume() 方法和 onPause() 方法之间所有的经历就是前台生存期。在前台生存期内,Activity 总是处于运行状态,此时可以和用户进行交互
#### Activity 被回收了怎么办?
**场景:**
`应用中有一个 Activity-A,用户在 Activity-A 的基础上启动了 Activity-B, 此时 Activity-A 就进入了停止状态,这个时候由于系统内存不足,就把 Activity-A 回收掉了,然后用户按下返回键 Back, 此时会出现什么情况?`
在这种情况下, Activity-A 会被重新创建,执行 onCreate() 方法, 而不会去执行 onRestart() 方法.
_请注意: Activity-A 中有可能存在临时的数据和状态,该如何处理?_
**onSaveInstanceState(Bundle)方法**
这个方法,可以保证 Activity 在被回收之前一定被调用,此外, Bundle 类型参数.提供了一系列方法用于保存数据, 这样就可以进行临时数据的保存了.
```
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
Log.w(tag, "onSaveInstanceState 回调")
outState.putBoolean("IS_LANDSCAPE", !isLandscape)
}
```
```
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.w(tag, "onCreate 创建,初始化")
setContentView(R.layout.activity_normal)
if (savedInstanceState != null) {
isLandscape = savedInstanceState.getBoolean("IS_LANDSCAPE")
Log.w(tag, "当前屏幕方向是否为横屏:$isLandscape")
}
initListener()
}
```
以上代码 from NormalActivity.kt
**扩展:** Bundle 还可以与 Intent 结合一起用于传递数据.
- 首先,把需要传递的数据保存在 Bundle 对象中;
- 然后,在将 Bundle 对象存放在 Intent 中;
- 到了了目标 Activity 之后,先从 Intent 中取出 Bundle, 再从 Bundle 中一一取出数据