Pich Blog

关注移动开发,大数据,云计算,软件架构!

1.Activity的生命周期

概述

Activity的生命周期说简单,也简单说复杂也复杂,所以在此总结一番。

生命周期方法

我们都知道activity的生命周期会调用一系列的方法。他们是

onCreate:activity正在被创建,在这里做一些初始化工作,比如调用setContentView,findViewById,绑定监听,请求数据。

onStart:activity正在启动,这是activity已经可以见,但还是在后头,无法和用户交互。

onRestart(第一次不执行):表示activity正在重新启动,比如用户进入另一个界面,在回来。

onResume:activity已经可见,并且出现在前台,可以和用户交互了。

onPause:activity正在停止,比如跳转到另一个界面,或者弹出一个对话框。在这里比如停止动画,暂停播放器,不能耗时。

onStop:activity即将停止,可以做一些稍微耗时的回收工作。

onDestroy:activity即将被销毁,必须做回收工作和资源的释放。

再来一张一张Google官方的图:


总结如下:

  1. 第一次进入:onCreate-onStart-onResume
  2. 回到桌面或启动新的界面:onPause-onStop
  3. 从桌面或者从新的界面回来:onRestart-onStart-onResume
  4. 退出:onPause-onStop-onDestroy
  5. 开启透明Activity:onPause
  6. 如果是从透明的activity返回:onResume

注意:显示Dialog不回调Activity的生命周期方法。

疑问1.onStart和onResume,onPause和onStop有什么区别?

onStart,onStop是从用户可见的角度来回调的,onResume,onPause是根据是否可以根据用户交互调用。

疑问2.AActivity的onPause和BActivity的onResume谁先执行?

通过日志发现:

可以看到先调用的是AActivity的onPause方法,然后就调用BActivity的onCreate,onStart,onResume,最后才调用AActivity的onStop方法。

之所以要这样设计是因为,释放资源我们需要在onPause方法中,比如:释放相机。因为有可能下一个界面也需要相机,不在这个方法释放就会拿不到。同时这个方法执行的时间如果超过了500ms,ActivityManagerService会强制关闭这个activity(测试未重现)。

这个时间定义在

/frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

疑问3.返回一个界面他们两个界面的生命周期是如何调用的呢?

通过log发现:

发现先执行BActivity的onPause,然后在执行Activity的onRestart-onStart-onResume,最后在执行BActivity的onStop-onDestroy,这样也和我们上面那个界面说的一样,现在BActivity的onPause里面释放像相机这样的资源,然后Activity就可以在onResume这样的方法中再次获取到相机资源。

转屏生命周期

默认情况下的生命周期方法如下:

异常终止时系统会调用onSaveInstanceState和onRestoreInstanceState来保存和恢复一些状态,我们可以在保存自定义的数据。恢复数据在onRestoreInstanceState和onCreate方法中。

onSaveInstanceState的调用时机是在onStop之前,他和onPause没有规定的顺序有时候在前有时候在后面。

如何保存状态

当我们这个界面有些临时信息,必须要永久保存,那我们可以通过onSaveInstanceState方法保存,然后在恢复。

这样就可以保存和恢复数据了,onCreate和onRestoreInstanceState的区别是一旦onRestoreInstanceState调用就说明肯定有值,官方推荐在onRestoreInstanceState恢复。

默认View都保存那些信息

首先Android的恢复和保存内容的工作机制是,activity被意外终止,他会调用onSaveInstanceState,然后调用父类的onSaveInstanceState,在该方法中activity委托Window,然后Window在委托顶层容器一般是DecorView再去保存数据,最后在通知子元素保存。这是典型的委托思想,android中应用很常见,比如:绘制,事件分发。

可以说每个控件保存的信息都一样。我们看看TextView的。

可以看到在这里保存了文本,选择状态,和错误文本。

可以看在恢复的方法中也确实恢复了。

资源不足Activity被杀

这种情况不好复现,但是保存和恢复数据的方法和上面一样。

Activity优先级

/前台Activity:正在和用户交互的,优先级最高

可以见但无法交互:优先级中

后台:优先级最低

如果系统内容不足时会按照上面的顺序销毁,同时保存数据。

禁用转屏销毁Activity

多数情况下我们肯定是不想转屏就销毁Activity的。那么怎么处理呢?

其实只需要配置configChanges就可以了

但是在minSdkVersion和targetSdkVersion大于13需要添加screenSize。

这样在转屏的时候只会执行onConfigurationChanged方法,可以在这里获取新的配置:

取值如下:

参考:http://blog.csdn.net/a78270528/article/details/46926553

http://androidxref.com/7.1.1_r6/xref/frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注