【问题标题】:Do we also have to save previous activity state on resource cleanup in background when using startActivityForResult()?使用 startActivityForResult() 时,我们是否还必须在后台进行资源清理时保存先前的活动状态?
【发布时间】:2020-02-25 18:50:49
【问题描述】:

我有一个主要活动,使用 startActivityForResult() 将我带到另一个活动。生成的活动执行一个过程并最终将一个对象返回给主活动。我的问题是:

  1. 如果用户在结果活动中按下他的 android 屏幕上的主页按钮并且 android 清理了我的应用程序的资源,我是否必须只保存结果活动的状态,或者我还必须保存主要活动和结果活动的状态,以恢复我的应用当前状态。

  2. 如果我必须保存两个活动的状态,我该怎么做?

附注: 我的主要活动中添加了一些数据。我想恢复我的结果和主要活动的状态。

【问题讨论】:

    标签: android android-lifecycle startactivityforresult onsaveinstancestate


    【解决方案1】:

    如果用户在结果活动中按下他的 android 屏幕上的主页按钮,并且 android 清理了我的应用程序的资源,我是否必须只保存结果活动的状态,或者我还必须保存状态主要活动和结果活动,以恢复我的应用当前状态

    您无需手动触发onSaveInstanceState()。所以通过执行这个方法保存的所有状态都会被自动持久化。

    但是

    • 默认情况下,甚至不会保存所有Views 的状态。例如,如果您未设置属性android:freezesText="true",则更改文本的TextView 将恢复为布局文件中的文本

    • 如果您在Activity 的字段(属性)中存储了一些数据,如果您不采取措施将其持久化,它将丢失(注意这对ViewModels 也有效-它们在配置更改后仍然存在,但它们不是永生的)。

    持久化数据的选项:如果与View 层相关,例如RecyclerView 中的选定项目,可以覆盖 onSaveInstanceState() 并将项目 ID 保存在 savedInstanceState Bundle 中。其他可能性包括写信给SharedPreferences 并拥有一个 SQLite 数据库。另见Options for preserving UI stateData and file storage overview

    【讨论】:

    • 感谢您的回答,但我是否也保存了以前活动的状态?
    • @Syed Hissaan - 是的,对于这两个活动。如果您按下 HOME 按钮,则两者都将处于已保存状态,或者(一段时间后,取决于设备发生的其他情况)为无
    • 最后一个。我们是否必须在两个活动中单独覆盖 onsavedInstanceState(),或者我们是否必须在结果活动中保存这两个活动的状态。
    • 您不应该尝试直接从另一个 Activity 调用一个 Activity 的方法。 (这将导致您的组件非常紧密地耦合,这是不可取的,因为未来的更改将更难实现)。作为推论,每个 Activity 都将负责保存自己的状态,因此您必须在两个 Activity 中覆盖 onSaveInstanceState()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多