当前位置:   article > 正文

Android activity生命周期重走_android recreate 生命周期

android recreate 生命周期


前言

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

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

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

配置项更改导致重建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>
  • 1
白天/黑夜模式
   <activity android:name="" android:configChanges="uiMode"></activity>
  • 1
系统语言切换
   <activity android:name="" android:configChanges="locale|layoutDirection|keyboard"></activity>
  • 1

解法探究

  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

参考链接

  1. Google官方:深色主题背景
  2. 插件式换肤原理
  3. Android onSaveInstanceState/onRestoreInstanceState 原来要这么理解
  4. Android提升篇系列:Activity recreate(Activity 重新创建/自我恢复)机制(一)
  5. Activity的生命周期之recreate
  6. Activity & Fragment 的重建、数据恢复相关问题解惑
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/898756
推荐阅读
相关标签
  

闽ICP备14008679号