Android activity生命周期重走


前言

从切换白天和黑夜模式说起
一个场景是页面有倒计时功能,并实时显示时钟和倒计时剩余分钟数提醒
此时切换白天和黑夜模式导致页面生命周期重走,数据全部重置,问题出现

实际测试发现切换白天/黑夜模式,切换系统语言均会导致生命周期重走。

那么有哪些场景会导致页面生命周期重走?

配置项更改导致重建Activity

在这里插入图片描述

activity重建的细节

  1. Activity 重建过程中,先将原来的Activity 进行销毁(从onPause > onStop > onDestroy > onCreate 的生命周期)。
  2. 虽然是不同的Activity 对象,但重建时使用的ActivityClientRecord 却是相同的,而ActivityClientRecord 最终是被ActivityThread 持有,它是全局的。这也是onSaveInstanceState/onRestoreInstanceState 能够存储与恢复数据的本质原因。

activity重建的原因分析

  1. 系统内存不足
  2. 配置项改变(configuration change )
    例如横竖屏切换,白天黑夜模式切换
  3. 调用activity的onCreate()方法

配置项声明不重建activity

横竖屏切换
   <activity android:name="" android:configChanges="orientation|screenSize"></activity>
白天/黑夜模式
   <activity android:name="" android:configChanges="uiMode"></activity>
系统语言切换
   <activity android:name="" android:configChanges="locale|layoutDirection|keyboard"></activity>

解法探究

  1. UI自动跟随系统切换,保存和恢复数据,使用onSaveInstanceState保存数据或状态,onRestoreInstanceState恢复页面状态
    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Logger.i(TAG, "onSaveInstanceState  outState... ");
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Logger.i(TAG, "onRestoreInstanceState... ");
    }
  1. 数据不变,重绘UI,声明配置项,页面不会重走,UI在onConfigurationChanged回调刷新即可
@Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Logger.i(TAG, "onConfigurationChanged... ");
      

        int currentNightMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;
        switch (currentNightMode) {
            case Configuration.UI_MODE_NIGHT_NO:
                // Night mode is not active, we're using the light theme
                break;
            case Configuration.UI_MODE_NIGHT_YES:
                // Night mode is active, we're using dark theme
                break;
        }
    }

参考链接

  1. Google官方:深色主题背景
  2. 插件式换肤原理
  3. Android onSaveInstanceState/onRestoreInstanceState 原来要这么理解
  4. Android提升篇系列:Activity recreate(Activity 重新创建/自我恢复)机制(一)
  5. Activity的生命周期之recreate
  6. Activity & Fragment 的重建、数据恢复相关问题解惑
  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的Activity生命周期包括以下几个方法:onCreate、onStart、onResume、onPause、onStop和onDestroy。onCreate方法被调用时,表示Activity正在被创建,可以在这个方法中进行一些初始化操作。onStart方法在Activity即将变为可见状态时被调用,可以在这个方法中开始一些活动,如注册监听器等。onResume方法在Activity变为可见并且可以与用户进行交互之前被调用,可以在这个方法中开始一些动画、音乐等操作。onPause方法在Activity失去前台焦点、但仍然可见时被调用,可以在这个方法中暂停一些活动,如暂停动画、音乐等操作。onStop方法在Activity完全不可见时被调用,可以在这个方法中释放一些资源,如取消注册监听器等。onDestroy方法在Activity即将被销毁时被调用,可以在这个方法中进行一些回收工作,如释放资源。根据不同的情况,Activity生命周期的调用顺序可能有所不同,但是每个生命周期方法都有其特定的用途。例如,onPause和onResume方法通常是成对出现的,表示Activity失去前台焦点和重新获得前台焦点。总体而言,Activity生命周期的不同阶段可以用来管理资源的创建、释放和活动的状态切换等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Android ActivityActivity生命周期](https://blog.csdn.net/qq_38350635/article/details/88855761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值