使用Android的新架构组件,savedInstanceState是否重要?

时间:2017-06-06 15:35:21

标签: android android-architecture-components

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

还有driving data from a single persistent model的概念:

  

第二个重要原则是你应该从一个驱动你的用户界面   模型,最好是持久模型。持久性是两个人的理想选择   原因:如果操作系统破坏您的应用程序以释放,您的用户将不会丢失数据   资源和您的应用程序即使在网络上也将继续工作   连接是片状的或没有连接。模型是组件   负责处理应用程序的数据。他们是独立的   从应用程序中的视图和应用程序组件,因此它们是孤立的   从这些组件的生命周期问题。

类似a single source of truth

的概念
  

在这个模型中,数据库是唯一的事实来源,并且   应用程序的其他部分通过存储库访问它。不管   无论您使用磁盘缓存,我们建议您使用存储库   将数据源指定为其余部分的唯一真实来源   你的应用。

在我看过的代码示例中,他们将savedInstanceState包传递给超类的实现,例如:

@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);
}

但是,似乎我们的活动没有理由将任何重要值显式存储/保存到savedInstanceState中。

savedInstanceState与新架构无关吗?

1 个答案:

答案 0 :(得分:7)

  

似乎我们的活动没有理由将任何重要值显式存储/保存到savedInstanceState中。

这完全取决于活动中的内容。

  

savedInstanceState与新架构无关吗?

没有

保存的实例状态背后的想法一直并且将继续帮助活动假装它一直存在,即使活动已被破坏并在此过程中重新创建,原因可能是:

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

因此,例如,假设我们有一个带有表单的活动。当用户填写表单并单击“保存”操作栏项时,我们希望保留表单的内容。并且,在某些情况下,我们正在打开一些已经存在的现有数据的表单,因此我们想要加载它。这些是Android架构组件(尤其是Room)旨在提供帮助的问题。

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

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

数据存储(例如,数据库)代表单一的“事实来源”,但是应用程序逻辑决定何时数据变为“真实”,而实例状态是处理数据的常用方法这可能成为未来的真相,但现在还不是真理。