Activity的生命周期(二)

上一篇说了些正常情况下的Activity的生命周期,这篇说一说异常情况下的Activity的生命周期,这里异常情况是指,资源相关的配置发生改变、系统内存不足Activity被杀死。

1.资源相关的配置发生改变

最典型的情况就是屏幕发生旋转,当一个Activity启动后,这是时屏幕旋转后,它的生命周期是这样的:onPause->onStop->onDestroy->onCreate->onStart->onResume

可以看出,当前Activity相当于被重新启动了一样,你在此Activity做的一切操作都会被销毁,例如在EditText中输入的文字,RecyclerView的滚动位置等。但是Activity是在异常情况下被终止的,系统会调用onSaveInstanceState保存当前Activity的状态,当Activity被重新创建后系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceStateonCreate方法。因此,我们可以通过onRestoreInstanceStateonCreate方法来判断Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并恢复。我们经常在onCreate中看到的一个Bundle 类型的savedInstanceState就是做这个用。

Activity的生命周期(二)_第1张图片
图1-1

onSaveInstanceState、onRestoreInstanceState同样也有这个参数。


Activity的生命周期(二)_第2张图片
图1-2 数据的保存和恢复

所以当一个Activity启动后,这是时屏幕旋转后,它的生命周期其实是这样的:onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume。这里需要注意的是,onSaveInstanceState的调用时机一定在onStop之前但是不一定在onPause之后,一般是在onPause之后,但是也有可能会在onPause之前调用。onRestoreInstanceState则是onStart之后。

这里我们注意到一点onCreate和onRestoreInstanceState都可以进行数据恢复,那么我们该用哪个做数据恢复呢?官方给出的建议是使用onRestoreInstanceState进行数据恢复,原因很简单,如果我们用onCreate中Bundle类型的savedInstanceState参数在正常调用时是空的,我们需要做额外的非空判断,但是onRestoreInstanceState中Bundle类型的savedInstanceState参数只要onRestoreInstanceState被调用则一定不为空,即便你没有在onSaveInstanceState做保存操作。

比如我们直接在onRestoreInstanceState中把Bundle类型的savedInstanceState参数给打印出来

Activity的生命周期(二)_第3张图片
图1-3

控制台输出是这样的

Activity的生命周期(二)_第4张图片
图1-4

虽然可能看不懂这是啥,但是至少不是null,同样如果在onCreate直接打印参数savedInstanceState,则正常启动时会直接报错。


2.系统内存不足Activity被杀死

这种情况我们不好模拟,但是其数据存储和恢复过程和情况1完全一致。这里我们描述一下Activity的优先级情况。Activity按照优先级从高到低,可以分为如下三种:

(1).前台Activity——正在和用户交互的Activity,优先级最高。

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

(3).后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。

当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数数据。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独自运行在后台中,这样进程很容易被杀死。比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易地被系统杀死。

3.强制不重新创建Activity,避免数据的保存和恢复

当系统配置发生改变后,Activity会被重新创建,那么有没有办法不重新创建呢?答案是有的,接下来我们就来分析这个问题。系统配置中有很多内容,如果当某项内容发生改变后,我们不想系统重新创建Activity,可以给Activity指定configChanges属性。比如不想让Activity在屏幕旋转的时候重新创建,就可以给configChanges属性添加orientation这个值,如下所示。

图1-5

那么上图中的keyboardHidden和screenSize是什么意思请参考下面的表格,这里不再赘述

Activity的生命周期(二)_第5张图片
图1-6

ps:其实当下我们手机里的app绝大多数已经不支持横屏操作,主要原因不仅仅是有些数据的保存和恢复很麻烦,还有一些图片类的资源或者界面的布局需要根据横屏重新绘制,无形增加了开发成本,这都是当下企业开发app时不愿意看到的。

注:本文的部分内容和图片摘自互联网

你可能感兴趣的:(Activity的生命周期(二))