展开说说:Android之Activity的生命周期

概念:        

       生命周期即事物从诞生到结束的过程。activity有七个生命周期方法分别对应一个activity从诞生到销毁的七个关键节点,它是由Android主动通知我们的,我们只需要在这些方法内处理这个时间点应该做的事情即可。举个例子每天清晨会有闹钟提醒我们起床美好的一天从现在开始、然后这一天中铃声还会提醒我们上课、下课、吃午饭、午休结束,下午开始上课、下课,最后是放学铃声响起这一天的学习结束。我们的工作学习的一天有闹钟或者铃声来提醒,而Activity的启动过程-启动请求由Instrumentation来处理,然后它通过Binder向AMS发送请求,AMS内部维护一个ActivityStack并负责栈内的Activity的状态同步,AMS通过通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用(但是生命周期一样不代表所有过程都一样)。

       activity有七个生命周期方法分别是:onCreate、onStart、onResume、onPause、onStop、onDestroy以及onRestart。这几个方法大家一定都比较熟悉了,这里说一下onRestart只有在执行onstop但没onDestroy时重新显示页面才会执行,比如ActivityFirst启动ActivitySecond然后再销毁ActivitySecond此时会执行ActivityFirst的onRestart或者在进程管理器存在但不在前台的app切换到前台它之前在前台展示Activity也会执行onRestart生命周期方法。

典型生命周期:

有用户主动操作的情况,比如回到桌面、切换当前使用的app、锁屏、解锁等操作。下面以MainActivity和ActivityA为例:
首先启动MainActivity

10:03:54.442 MainActivity: onCreate: zhouqi:
10:03:54.449 MainActivity: onStart: zhouqi
10:03:54.459 MainActivity: onResume: zhouqi


然后启动ActivityA

10:04:04.804 MainActivity: onPause: zhouqi
10:04:04.844 ActivityA: onCreate: zhouqi:
10:04:04.871 ActivityA: onStart: zhouqi
10:04:04.904 ActivityA: onResume: zhouqi
10:04:05.386 MainActivity: onSaveInstanceState: zhouqi
10:04:05.388 MainActivity: onStop: zhouqi


关闭ActivityA

10:04:21.461 ActivityA: onPause: zhouqi
10:04:21.475 MainActivity: onRestart: zhouqi
10:04:21.476 MainActivity: onStart: zhouqi
10:04:21.477 MainActivity: onResume: zhouqi
10:04:21.878 ActivityA: onStop: zhouqi
10:04:21.883 ActivityA: onDestroy: zhouqi


锁屏

10:05:28.605 MainActivity: onPause: zhouqi
10:05:28.633 MainActivity: onSaveInstanceState: zhouqi
10:05:28.638 MainActivity: onStop: zhouqi

亮屏(这里指的是亮屏解锁显示本应用,不解锁单纯点亮屏不执行任何生命周期

10:05:36.967 MainActivity: onRestart: zhouqi
10:05:37.002 MainActivity: onStart: zhouqi
10:05:37.010 MainActivity: onResume: zhouqi

点击home键回到桌面

10:09:17.536 MainActivity: onPause: zhouqi
10:09:17.571 MainActivity: onSaveInstanceState: zhouqi
10:09:17.574 MainActivity: onStop: zhouqi

从任务列表回到本应用或者是重新点击应用图标

10:09:30.971 MainActivity: onRestart: zhouqi
10:09:30.988 MainActivity: onStart: zhouqi
10:09:30.992 MainActivity: onResume: zhouqi

注意:
1. 启动透明主题的Activity原Activity不会执行onStop
2. Activity上面弹出本Activity自己的dialog和alertDailog都不会执行任何生命周期,只有这个对话框的上下文是其他Activity弹出的才会执行生命周期执行,此时会onPause但不会onStop

异常生命周期:

内存不足或者资源相关的系统配置发生改变导致Activity被杀死并重新启动。由于Activity是在异常情况下终止因此系统胡调用onSaveInstanceState来保存当前Activity的状态。调用时机在onStop之前和onPause无既定的时序关系。当新Activity重启之后销毁时存的Bundle传给onRestoreInstance和onCreate(建议在前者取,前者只要被调用就不会为空,后者都会被调用但正常启动时bundle为null),onRestoreInstance在onStart之后。还有一些是系统自动保存和恢复的,比如Activity的试图结构中的文本框中输入的数据、listView滚动的位置等。具体某个View系统能为我们恢复哪些数据需要看它内部onSaveInstanceState和onRestoreInstance的实现。

它数据Android中典型的委托思想,上层委托下层父容器委托子容器去处理一件事情,view绘制、事件分发等都是。

说到生命周期不得不提到在清单文件中影响activity生命周期的两个属性。

  1. configchange用于设置捕获手机状态的改变
    2.screenoritation:手动设置修改该屏幕变化(只要发生了屏幕旋转都会销毁重建并执行以下生命周期)
    默认情况横竖屏切换的(针对单个activity设置):onPause、onStop、onDestroy、onCreate、onStart、onResume只执行了一次生命周期,就是这6个方法
     ScreenOritation设置为landscape始终横屏origation始终竖屏。

     configchange 默认时横竖屏旋转的生命周期(onSaveInstance通过Bundle保存数据)
    ActivityA: onPause: zhouqi
    ActivityA: onSaveInstanceState: zhouqi  对你说 text 好好保存哦
    ActivityA: onStop: zhouqi
    ActivityA: onDestroy: zhouqi
    ActivityA: onCreate: zhouqi: text好好保存哦
    ActivityA: onStart: zhouqi
    ActivityA: onRestoreInstanceState: zhouqi  好好保存哦
    ActivityA: onResume: zhouqi

        补充一点如果设置 了android:configChanges="orientation|keyboardHidden|screenSize",将不再执行生命周期,只会调用activity内部的onconfigurationchanged方法,另外不要在onPause做重量级操作,因为当前activity的onPause结束后新activity的onResume才会被调用,因此如果比较耗时的话会影响新Activity的显示。

才疏学浅,如有问题,欢迎指正,多谢。 

你可能感兴趣的:(学习总结,bug-日常积累,android)