# Activity 生命周期

Activity是由Activity栈进管理，当来到一个新的Activity后，此Activity将被加入到Activity栈顶，之前的Activity位于此Activity底部。<!--more-->



什么是栈？简单地讲： 当你打开一个APP时会新建一个Activity ，相当于在你面前放了一张纸，这张纸上写的东西可以理解为你手机屏幕上显示的内容。当你点击一个按钮打开新的Activity时，相当于在原来那张纸上面放了另一张纸，这张纸上写着不同的内容，所以我们手机屏幕上UI也会改变。当我们销毁Activity时，就撕掉对应的纸。例如我们点击返回上一页面时，销毁处于栈顶的Activity，处于第二位的Activity进入栈顶并将内容显示到屏幕上。

#### **Acitivity一般意义上的四种状态**

**<span style="display: inline !important; float: none; background-color: #ffffff; color: #333333; cursor: text; font-family: 'Noto Serif',serif; font-size: 17px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">在每个不同的状态阶段，Android 系统对 Activity 内相应的方法进行了回调。</span>（就是执行函数）**

1.当Activity位于栈顶时，此时正好处于屏幕最前方，此时处于**运行状态**；

2.当Activity失去了焦点但仍然对用于可见（如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕），此时处于**暂停状态**；

3.当Activity被其他Activity完全遮挡，此时此Activity对用户不可见，此时处于**停止状态**；

4.当Activity由于人为或系统原因（如低内存等）被销毁，此时处于**销毁状态；**

#### 典型的生命周期

所谓的典型的生命周期就是在有用户参与的情况下，Activity经历从创建，运行，停止，销毁等正常的生命周期过程。我们这里先来介绍一下几个主要方法的调用时机，然后再通过代码层面来验证其调用流程。

**onCreate** : 该方法是在Activity被创建时回调，它是生命周期第一个调用的方法，我们在创建Activity时一般都需要重写该方法，然后在该方法中做一些初始化的操作，如通过setContentView设置界面布局的资源，初始化所需要的组件信息等。

onStart : 此方法被回调时表示Activity正在启动，此时Activity已处于可见状态，只是还没有在前台显示，因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。

**onResume** : 当此方法回调时，则说明Activity已在前台可见，可与用户交互了（处于前面所说的Active/Running形态），onResume方法与onStart的相同点是两者都表示Activity可见，只不过onStart回调时Activity还是后台无法与用户交互，而onResume则已显示在前台，可与用户交互。当然从流程图，我们也可以看出当Activity停止后（onPause方法和onStop方法被调用），重新回到前台时也会调用onResume方法，因此我们也可以在onResume方法中初始化一些资源，比如重新初始化在onPause或者onStop方法中释放的资源。

**onPause** : 此方法被回调时则表示Activity正在停止（Paused形态），一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法，这属于比较极端的现象了，这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity，此时onResume方法就会被回调。当然，在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作，但是不能太耗时，因为这可能会影响到新的Activity的显示——onPause方法执行完成后，新Activity的onResume方法才会被执行。

**onStop** : 一般在onPause方法执行完成直接执行，表示Activity即将停止或者完全被覆盖（Stopped形态），此时Activity不可见，仅在后台运行。同样地，在onStop方法可以做一些资源释放的操作（不能太耗时）。

onRestart :表示Activity正在重新启动，当Activity由不可见变为可见状态时，该方法被回调。这种情况一般是用户打开了一个新的Activity时，当前的Activity就会被暂停（onPause和onStop被执行了），接着又回到当前Activity页面时，onRestart方法就会被回调。

**onDestroy** :此时Activity正在被销毁，也是生命周期最后一个执行的方法，一般我们可以在此方法中做一些回收工作和最终的资源释放。

官方流程图：

<img class="alignnone size-full wp-image-289" src="http://120.78.201.42/wp-content/uploads/2018/11/activity_lifecycle.png" alt="" width="513" height="663" />

#### 实际操作

1.在AS新建一个Activity，其会自动调用 onCreate 方法并引用布局资源，如图所示

<img class="alignnone size-full wp-image-290" src="http://120.78.201.42/wp-content/uploads/2018/11/Activity生命周期-2018-11-12-093509.jpg" alt="" width="537" height="270" />

我们在 onCreate 函数里面写入的内容都会在打开 Activity 时自动执行。

2.调用 onResume 函数

我们创建两个 Activity ，由 A 跳转至 B，在 A 页面调用 <span style="display: inline !important; float: none; background-color: #ffffff; color: #333333; cursor: text; font-family: 'Noto Serif',serif; font-size: 17px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">onResume 函数并用 Log 输出当前调用次数。当我们打开 A 时， onCreate 与 onResume 函数都会执行，Log会输出：</span>执行次数：1，当我们<span style="display: inline !important; float: none; background-color: #ffffff; color: #333333; cursor: text; font-family: 'Noto Serif',serif; font-size: 17px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">由 A 跳转至 B 后，A会处于stopped（停止）状态，再将 B 销毁，A加入栈顶，此时 onResume 执行回调而 onCreate 函数不执行，Log输出：执行次数：2。若 onCreate 函数也执行回调，会先将 n 重新赋值为 0，再执行 n = n + 1，输出结果为1。</span>

```java
public class TestActivity extends AppCompatActivity {
    int n;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        n = 0;
    }
    @Override
    protected void onResume() {
        super.onResume();
        n = n + 1;
        Log.e("onResume执行","执行次数：" + n);
    }
}
```

其他方法与之类似。

Activity生命周期的用途十分广泛，例如登陆状态的验证、数据更新等
