① Activity 的生命周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yz_cfm/article/details/89409406
点击查看大图

一、正常情况下生命周期:

点击查看大图

正常情况下的 7 种生命周期:

单击查看大图

针对下面几种情况,当前 Activity 生命周期回调:

① 当前 Activity 第一次启动时: onCreate() -> onStart() -> onRestart()

② 用户跳转到新的 Activity 或者 按下 Home 键回到桌面时:onPause() -> onStop()。这里有一种特殊情况,如果新的 Activity 采用了透明主题,那么当前 Activity 只回调 onPause() 方法,而不会回调 onStop()。此时如果再次回到当前 Activity时:onRestart() -> onStart() -> onResume()

③ 用户按 back 键返回时:onPause() ->onStop() -> onDestroy()

④ 当前 Activity 被系统回收后再次打开,生命周期方法回调和 ① 一样,注意只是生命周期回调一样,不代表所有过程都一样,后面会说。

⑤ 整个生命周期中:onCreate() 和 onDestroy() 是配对的,分别标识着 Activity 的创建和销毁,并且一个生命周期中都只可能调用一次。onStart() 和 onStop() 是配对的,分别标识着 Activity 可见和不可见,随着用户的操作或者设备的点亮和熄灭,这两个方法可能被多次调用。onResume() 和 onPause() 是配对的,分别标识着 Activity 前台可见和不可见,它们也会随着用户的操作或者设备的点亮和熄灭被多次调用。

    最后,我们需要注意一个问题,当 Activity A 启动 Activity B 时,Activity A 必须先执行完 onPause() 之后, Activity B 才会被创建并显示。这个过程生命周期回调为: A onPause() -> B onCreate() -> B onStart() -> B onResume()。所以,我们不能在 onPause() 中执行耗时的操作,可以将一些稍微重量级的回收工作放在 onStop() 方法里,同样这里也不能太耗时。

二、异常情况下生命周期:

单击查看大图

情况1:资源相关的系统配置发生改变导致 Activity 被杀死并重新创建:

    首先,系统配置发生改变什么意思?举个简单的例子,手机在由横屏切换到竖屏时,这个就是 Android 中的 orientation 配置发生了改变。当然,Android 系统中有很多的配置项目,我们可以自己在官网上查询。在 AndroidMenifest.xml 中可以通过配置 activity 的 configChanges 属性,来决定当配置发生改变时 Activity 是否重新创建。并且不管 Activity 是否重建,当系统配置发生改变时都会回调如下方法,我们可以在里面写相应的逻辑代码:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

    我们这里讨论的是,当配置发生改变并且导致了 Activity 销毁并且重新创建时的生命周期。当 Activity 被销毁时,生命周期回调: onPause() -> onStop() -> onDestroy() 。由于此时 Activity 是在异常情况下终止的,系统会调用 onSaveInstanceState() 来保存当前 Activity 的状态。这个方法的调用时机是在 onStop() 之前,和 onPause() 没有既定的时序关系,可能在其之前,也可能是在之后。需要注意的是,onSaveInstanceState() 方法只是在 Activity 异常情况下被终止时调用,正常情况下被销毁不会调用此方法。当 Activity 被重新创建后,系统会调用 onRestoreInstanceState() 方法,并且把Activity 销毁时 onSaveInstanceState() 方法中所保存的 Bundle 对象作为参数同时传递给 onRestoreInstanceState() 和 onCreate() 。因此我们可以通过 onRestoreInstanceState() 和 onCreate() 方法来恢复 Activity 异常终止前的某些数据。从时序上说,onRestoreInstanceState() 在 onStart() 之后调用。

    既然 onRestoreInstanceState() 和 onCreate() 方法都能恢复数据,它们的区别是什么?onRestoreInstanceState() 一旦被调用,其参数 Bundle 对象一定是有值的,此时我们不需要额外的判断其是否为空;但是 onCreate() 不行,onCreate() 如果是正常启动的话,参数 Bundle 对象为 null,所以必须要额外判断。官方建议在 onRestoreInstanceState() 恢复数据。下面是 onSaveInstanceState() 和 onRestoreInstanceState() 回调方法:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
}

情况2:资源内存不足导致低优先级的 Activity 被杀死:

    Activity 按照优先级从高到低,可以分为如下三种:

    ① 前台 Activity --- 正在和用户交互的 Activity,优先级最高。

    ② 可见但非前台 Activity --- 比如 Activity 中弹出了一个对话框,导致 Activity 可见但是位于后台无法和用户直接交互。

    ③ 执行了 onStop() 但是还没执行 onDestroy 的后台 Activity --- 优先级最低。

    当系统内存不足时,系统就会按照上述优先级去杀死目标 Activity 所在的进程,并在后续通过 onSaveInstanceState() 和 onRestoreInstanceState() 来存储和恢复数据。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作一般是在 Service 中执行。

    综上,异常情况下的生命周期变化中,我们可以在 onSaveInstanceState() 和 onRestoreInstanceState() 方法中来存储和恢复相关的数据。

猜你喜欢

转载自blog.csdn.net/yz_cfm/article/details/89409406