对于 Android 的新架构组件,savedInstanceState 重要吗?

With Android's new architecture components, does savedInstanceState matter?

阅读 Android 的 new Architecture Components,建议使用各种 ViewModel 实例将数据提供给 Activity 和 Fragment。

还有这个概念driving data from a single persistent model

The second important principle is that you should drive your UI from a model, preferably a persistent model. Persistence is ideal for two reasons: your users won't lose data if OS destroys your app to free up resources and your app will continue to work even when a network connection is flaky or not connected. Models are components that are responsible for handling the data for the app. They are independent from the Views and app components in your app, hence they are isolated from the lifecycle issues of those components.

a single source of truth类似的概念:

In this model, the database serves as the single source of truth, and other parts of the app access it via the repository. Regardless of whether you use a disk cache, we recommend that your repository designate a data source as the single source of truth to the rest of your app.

在我看到的代码示例中,它们确实 将 savedInstanceState 包传递给超级 class 的实现,例如:

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    String userId = getArguments().getString(UID_KEY);
    viewModel = ViewModelProviders.of(this).get(UserProfileViewModel.class);
    viewModel.init(userId);
}

但是,我们的 Activity 似乎没有理由再显式 store/retrieve 重要值 to/from savedInstanceState。

savedInstanceState与新架构无关吗?

it seems like there's no reason any more for our Activities to explicitly store/retrieve important values to/from savedInstanceState.

这完全取决于活动内容。

Is savedInstanceState irrelevant with the new architecture?

没有

保存实例状态背后的想法一直并将继续帮助 activity 假装它一直存在,即使 activity 已被摧毁并重新创建一路走来,要么是因为:

  • 配置更改(例如,屏幕旋转),或
  • 进程终止(例如,用户离开应用,Android终止进程,用户returns在半小时内回到应用)

因此,例如,假设我们有一个带有表单的 activity。当用户填写表单并单击 "save" 操作栏项时,我们希望保留表单的内容。而且,在某些情况下,我们在一些已经持久化的现有数据上打开表单,因此我们想要加载它。 Android 架构组件(尤其是 Room)旨在帮助解决这些问题。

但是,假设用户在表单上填写了一个字段,然后旋转了屏幕。在这种情况下,很可能我们还不想将更改保存在数据库中,因为用户尚未单击 ​​"save" 来表示有兴趣保留此更改。所以,我们依靠 onSaveInstanceState() 来为我们处理这个问题。在这种情况下,内置 onSaveInstanceState() 处理这个,因为 EditText 的内容显然是用户可变状态。

但是,另外假设,在编辑字段后,用户点击 ImageButton 以选择联系人。它使用 ACTION_PICK 调出联系人选择器,用户可以在那里选择一个联系人。控制 returns 到原来的 activity,它可能有一个 TextView 来显示联系人的名字,或者可能用联系人头像更新 ImageButton现在 用户旋转屏幕。再一次,我们可能不想坚持这一点。然而,这一次,activity 不会自动保持我们联系人的 Uri,因为它不知道如何保持。所以,我们自己把它放在保存的实例状态 Bundle 中,覆盖 onSaveInstanceState().

数据存储(例如数据库)表示单个 "source of truth",但决定 数据何时变为 "truth" 和实例状态的是应用程序逻辑是处理未来可能成为事实但目前还不是事实的数据的常用方法。