返回

优雅应对突发状况,APP 状态恢复更从容

Android

纵享丝滑体验,从容应对 APP 状态恢复

在 APP 开发过程中,状态恢复是一个常见且重要的挑战。当设备屏幕方向发生改变、用户在后台执行其他任务后返回 APP,或者 APP 进程意外终止时,我们需要确保 APP 能够从中断处恢复到之前的样子。传统上,状态恢复是一个复杂且容易出错的过程,需要手动管理和同步各种组件的状态。

MVI(Model-View-Intent)架构通过引入单向数据流和状态机,极大地简化了状态恢复的过程。在 MVI 架构中,APP 的状态只受用户输入和模型影响,因此恢复状态只需恢复模型的状态即可。这大大减少了需要管理的状态量,并使状态恢复变得更加清晰和可预测。

从容面对突发状况

在内存中恢复状态:屏幕方向、软键盘

在内存中恢复状态是指在 APP 进程仍在运行的情况下恢复状态,例如屏幕方向发生改变或软键盘的弹出和隐藏。在 MVI 架构中,这种状态恢复非常简单,因为模型的状态已经包含了所有需要的信息。当屏幕方向发生改变时,只需将当前的模型状态传递给新的视图,然后视图根据新的方向重新渲染即可。同样,当软键盘弹出或隐藏时,只需将当前的模型状态传递给新的视图,然后视图根据新的键盘状态重新渲染即可。

// 当屏幕方向发生改变时
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // 将当前的模型状态传递给新的视图
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("modelState", modelState);
    startActivity(intent);
}

// 当软键盘弹出或隐藏时
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // 将当前的模型状态传递给新的视图
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("modelState", modelState);
    startActivity(intent);
}

恢复“持续状态”:从先前会话恢复

恢复“持续状态”是指当 APP 进程终止后从先前会话恢复状态。在 MVI 架构中,这种状态恢复同样非常简单,因为模型的状态可以持久化到磁盘。当 APP 重新启动时,只需从磁盘加载模型的状态,然后将该状态传递给新的视图即可。

// 当 APP 启动时
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 从磁盘加载模型的状态
    modelState = loadModelStateFromDisk();
    // 将模型的状态传递给新的视图
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("modelState", modelState);
    startActivity(intent);
}

结语

在 MVI 架构下,状态恢复变得更加简单且高效。通过利用单项数据流和状态机,我们可以大大减少需要管理的状态量,并使状态恢复变得更加清晰和可预测。无论是在内存中恢复状态还是恢复“持续状态”,MVI 架构都能为我们提供优雅而可靠的解决方案。