返回

activity 状态保存和恢复:大师之选

Android

序言

在 Android 开发中,掌握 activity 状态保存和恢复至关重要。当设备旋转、应用程序进入后台或系统清理内存时,您的应用程序必须能够恢复其状态,避免用户体验中断。本文将深入探讨此主题,提供切实可行的解决方案和最佳实践。

理解 Activity 生命周期

Activity 生命周期是一个状态机,定义了 activity 的不同状态:

  • onCreate(): 当 activity 首次创建时调用。
  • onStart(): 当 activity 变得可见时调用。
  • onResume(): 当 activity 获得焦点并准备与用户交互时调用。
  • onPause(): 当 activity 失去焦点但仍可见时调用。
  • onStop(): 当 activity 不再可见时调用。
  • onDestroy(): 当 activity 被销毁时调用。

状态保存和恢复

当 activity 被销毁或配置发生更改时,您需要保存其状态,以便稍后恢复。Android 提供了 onSaveInstanceState(Bundle outState) 和 onRestoreInstanceState(Bundle savedInstanceState) 方法来实现此目的。

在 onSaveInstanceState 中,您将当前 activity 状态存储在 Bundle 对象中。在 onRestoreInstanceState 中,您可以从 Bundle 中检索先前保存的状态,并使用它来恢复 activity 的状态。

使用 ViewModel

ViewModel 是一个与 activity 或 fragment 的生命周期无关的类。它提供了一种轻量级且可扩展的方法来保存和恢复状态,尤其适用于跨配置更改和进程死亡的情况。

要使用 ViewModel,请执行以下步骤:

  1. 创建一个 ViewModel 类,继承自 ViewModel。
  2. 在 activity 或 fragment 中,获取 ViewModel 的实例。
  3. 将需要持久化的状态存储在 ViewModel 中。

最佳实践

以下是一些在 activity 状态保存和恢复中遵循的最佳实践:

  • 仅保存真正需要在配置更改后恢复的必要状态。
  • 使用 ViewModel 来管理跨进程死亡的状态。
  • 在 onSaveInstanceState 中,避免存储大型对象或耗时的操作。
  • 在 onRestoreInstanceState 中,不要假设状态一定可用。

示例

考虑一个简单活动,显示一个带有文本输入的表单。为了在配置更改后保留用户输入,我们可以使用 ViewModel 存储输入的文本:

class MyViewModel : ViewModel() {
    var userInput: String = ""
}

class MyActivity : Activity() {

    private val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel.userInput = savedInstanceState?.getString("userInput") ?: ""
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("userInput", viewModel.userInput)
    }
}

结论

掌握 activity 状态保存和恢复是 Android 开发人员不可或缺的一项技能。通过理解 activity 生命周期、使用 ViewModel 以及遵循最佳实践,您可以创建健壮且响应迅速的应用程序,即使在面对意外销毁或配置更改时也能轻松恢复其状态。