Activity生命周期

Activity生命周期

Activity的生命周期对于Android开发者来说是最熟悉不过的东西了,回过头看安卓基础总结一下看的内容

Activity常用的生命周期有以下七个,onCreate、onRestart、onStart、onResume、onPause、onStop、onDestroy

常用生命周期

方法名简介
onCreate表示Activity正在被创建,这也是Activity的生命周期的第一个方法。
onRestart表示Activity正在重新启动,此生命周期只有在onPause与onStop都执行过才会被调用
onStart表示Activity正在被启动,即将开始,此时Activity已经可见但是还没有出现在前台,还无法交互
onResume表示Activity已经可见并出现在前台可以与用户进行交互
onPause表示Activity正在停止
onStop表示Activity停止并不可见
onDestroy表示Activity即将被销毁,这是Activity的最后一个回调

Activity生命周期切换过程

借一张网上的图,这个图说明了一个Activity从创建到销毁时各生命周期的状态

生命周期流程图

  1. Activity第一次启动,回调如下:onCreate -> onStart -> onResume

  2. 打开新Activity或按Home键:onPause->onStop

    如果新的Activity的Theme为Dialog或者Translucent(透明)时不会调用onStop方法

  3. 再次回到Activity:onRestart->onStart->onResume

  4. 按Back键退出Activity:onPause->onStop->onDestroy

生命周期的对应关系

Activity的生命周期是一一对应的,比如:

onCreate - onDestroy 创建与销毁,只可能为一次调用

onStart - onStop 可见与不可见,可能为多次调用

onResum - onPause 在前台与不在前台,可能为多次调用

AActivity启动BActivity

发现写的有问题已修改

正常情况下

启动BActivity:
在这里插入图片描述
返回AActivity:
返回AActivity

Theme为Dialog或Translucent

启动BActivity:
在这里插入图片描述

返回AActivity:
返回AActivity

异常情况下的生命周期

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

旋转屏幕横竖屏切换

Activity正常运行,此时旋转屏幕

在这里插入图片描述

当系统配置被更改时Activity会被销毁并重新创建,Activity的onPause、onStop、onDestroy均会被调用,同时由于Activity是异常情况下终止并销毁的系统会调用onSaveInstanceState方法来保存当前Activity的状态。

之后就是正常的启动流程,当然会有onRestoreInstancesState方法在onStart与onResume之间调用用以恢复onSaveInstanceState保存的状态。

在测试是发现onSaveInstancesState调用时期与艺术探索里面讲的在onStop之前这个说法不一致,多次测试都在onStop之后调用了此方法,翻谷歌官方文档发现此方法调用从Build.VERSION_CODES.P开始在onStop方法之后调用,对于面向较早平台版本的应用程序,此方法将在onStop()之前发生,并且不能保证它会在onPause()之前还是之后发生。
官方说明

官方文档关于此方法的介绍

接下来用onSaveInstanceonRestoreInstanceState方法来保存与恢复数据

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null){
            log("from onContext: " + savedInstanceState.getString("text"));
        }
    }

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("text","睡客");
        log("数据已保存");
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        log("from onRestoreInstancesState: " + savedInstanceState.getString("text"));
    }

我们可以在onCreateonRestoreInstanceState方法进行数据的恢复处理,onCreate方法中有一个参数,此参数就是onSaveInstanceState保存的值,在onCreate方法中需要对该参数进行空判断因为此参数在onCreate正常启动的情况下是为null的,至于onRestoreInstanceState这个方法不用进行空值判断因为此方法只要被调用它的值不可能为空,代码效果如下。
在这里插入图片描述

资源内存不足导致低优先级Activity被杀死
Activity优先级
  1. 前台Activity–用户正在交互的Activity,优先级最高
  2. 可见但非前台Activity
  3. 后台Activity–已经被停止的Activity,例如执行了onStop方法,优先级最低

当系统内存不足时会按照上面的优先级进行销毁,并通过onSaveInstanceStateonRestoreInstanceState来存储与恢复数据。

防止Activity被重新创建

当某项内容被改变时不想停止并重新创建Activity可以通过在AndroidManifest清单文件中对该Activity指定configChanges属性来防止重新创建,比如旋转屏幕时不想重新创建Activity可以指定orientation这个属性值,如:android:configChanges="orientation",如果想指定多个值可以用"|’'来连接起来如:android:configChanges="orientation|keyboardHidden"

一些configChanges属性
在这里插入图片描述

在指定configChanges之后Activity在该系统配置改变的情况下不会重新创建Activity也不会调用onSaveInstanceStateonRestoreInstanceState来保存或恢复数据,取而代之的是使用onConfigurationChanged方法。

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

在这里插入图片描述
源码Git链接

  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值