美文网首页
第一章 activity的生命周期

第一章 activity的生命周期

作者: 闫回 | 来源:发表于2020-03-06 21:35 被阅读0次

    在生命周期回调方法中,您可以声明用户离开和再次进入 Activity 时 Activity 的行为方式,每个回调都支持您执行适合给定状态变更的特定作业。在合适的时间执行正确的作业,并妥善处理转换,这将提升应用的稳健性和性能。
    1.1.1 典型情况下的生命周期分析

    Activity生命周期.png
    (1) onCreate
    系统首次创建 Activity 时触发。Activity 会在创建后进入已创建状态,这是生命周期的第一个方法,而且只发生一次,我们可以做一些初始化的工作或者使用savedInstanceState接收之前onSaveInstanceState保存的数据。
    (2) onRestart
    表示Activity正在重新启动,当当前activity从不可见重新变为可见状态时,onRestart就会被调用,这种情况一般是用户行为所导致,比如用户按Home键切换到桌面或者用户打开了一个新的Activity,这时当前的Activity就会暂停,也就是onPause和onStop被执行了,接着用户又回到了这个Activity,就会出现这种情况。
    (3) onStart
    此时activity已经可见了,但是还未出现在前台,还无法和用户交互。此方法会非常快速的完成。
    (4) onResume
    此时activity可见并且出现在前台活动,和onStart对比,onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。
    (5) onPause
    失去焦点,此方法表示 Activity 不再位于前台(尽管如果用户处于多窗口模式,Activity 仍然可见),此时可以做一些储存数据、停止动画等工作,但是注意不能太耗时,因为这会影响新的activity的显示,onPause必须先执行完,新activity的onResume才会执行。
    (6) onStop
    表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
    (7) onDestory
    表示Activity即将被销毁,这是Activity生命周期最后一个回调,在这里,我们可以做一些回收工作和最终的资源释放
    附加具体说明分如下几种情况:
    (1)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause-->onStop。这里有一种特殊情况,如果新Activity采用了透明的主题,那么当前Activity不会回调onStop,因为可见。
    (2)当用户再次回到原Activity时,回调如下:onRestart-->onStart-->onResume
    (3)当用户按back键回退时,回调如下:onPause-->onStop-->onDestory
    (4)onStart和onStop是从用户可见的角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的
    (5)假设当前Activity为A,如果这时用户打开一个新Activity B,那么B的onResume和A的onPause哪个先执行呢?
    新的Activity启动之前,栈顶的Activity需要先onPause后,新Activity才能启动,所以在onPause中不要做重量级的操作,因为必须onPause执行完以后新Activity才能onResume
    1.1.2 异常情况下的生命周期分析
    1.情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
    异常情况下Activity的重建过程
    Activity 意外情况 --->onSaveInstanceState -->onDestory
    重新创建 ---> onCreate --> onRestoreInstanceState
    由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法的调用时机是在onStop之前,它和onPause没有既定的时序关系,Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,如果被重建了,可以取出之前所保存的数据并恢复。
    在onSaveInstaceState和onRestoreInstanceState方法中,系统自动为我们做了一定的恢复工作。当Activity在异常情况下需要重新创建时,系统会默认为我们保存当前Activity的视图结构,并且在Activity重启后为我们恢复这些数据,比如文本框中用户输入的数据、listView滚动的位置等,这些View相关的状态系统都能默认为我们恢复。
    2.情况2:资源内存不足导致低优先级的Activity被杀死
    Activity按照优先级从高到低,可以分为如下三种
    (1)前台Activity-----正在和用户交互的Activity,优先级最高
    (2)可见但非前台Activity-------比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互
    (3)后台Activity-------已经被暂停的Activity,比如执行了onStop,优先级最低
    当系统内存不足时,系统就会按照上述优先级先去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来储存和恢复数据,如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死。因此,一些后台工作不适合脱离四大组件而独自运行在后台中,这样进程很容易被杀死,比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易被系统杀死。
    我们知道,当系统配置发生改变后,Activity会被重新创建,那么有没有办法不重新创建呢?如果当某项发生改变后,我们不想系统重新创建Activity可以给Activity指定configChanges属性。比如不想让Activity在屏幕旋转的时候重新创建就可以给configChanges属性添加orientation这个值,如下所示
    android:configChange="orientation",我们常用的只有local、orientation和keyboardHidden这三个选项,
    local表示设备的本地位置发生了改变,一般指切换了系统语言。
    orientation表示屏幕方向发生了改变,这是是最常用的,比如旋转了手机屏幕
    keyboardHidden键盘的可访问性发生了改变,比如用户调出了键盘。
    参考1.Android开发艺术探索
    2.官方文档https://developer.android.com/guide/components/activities/activity-lifecycle

    相关文章

      网友评论

          本文标题:第一章 activity的生命周期

          本文链接:https://www.haomeiwen.com/subject/dmuorhtx.html