我怎样才能保存活动状态(B)当搬到之前的活动 (A)以及当移回(到活动 B)时如何恢复它之前的状态?
SCENARIO
活动B的内容可以由用户更改。完成工作后,可以进行更改坚持(例如保存到本地数据库)。在坚持之前,用户可能想要导航回之前的活动。此时,“工作会话”应该以某种方式保存暂时存在记忆中。返回到活动 B 后,应恢复“工作会话”,以便用户可以继续工作。
方法
标准方法onCreate(Bundle)
and onSaveInstanceState(Bundle)
用于在设备配置更改时(例如旋转时)恢复/保存活动状态。作为onSaveInstanceState(Bundle) 不是 Activity 生命周期的一部分 https://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle),当 Activity 被销毁时,此方法不会在“后按”时被调用(默认情况下finish()
叫做)。这同样适用于onRestoreInstanceState(捆绑) https://developer.android.com/reference/android/app/Activity.html#onRestoreInstanceState(android.os.Bundle)。显然,仅这些方法不足以在离开活动后恢复活动状态。
在活动之间传输捆绑状态
我能想到的一种方法是覆盖onBackPressed()
这样它将启动一个Intent
到先前具有捆绑状态的活动 AIntent#putExtras(Bundle)
当前活动 B. 向后移动时,开始Intent
到 Activity B,该捆绑状态将被传递回Intent#putExtras(Bundle)
恢复 Activity B 的状态。但这也需要重写onCreate(Bundle)
and onSaveInstanceState(Bundle)
在 A 中,因此在导航回 B 之前,B 的捆绑状态不会因配置更改而丢失。
未在后按+非默认启动模式下完成活动
另一种方法(更干净)是覆盖onBackPressed()
这样它就会开始Intent
不调用之前的活动 Afinish()
当前活动 B 的活动,因此活动 B 将以暂停状态挂在内存中(等待恢复)。要恢复活动 B,清单配置android:launchMode="singleInstance"
是必需的,因此当导航回活动 B 时,android 将使用现有活动(已暂停 B)而不是创建新活动(B2)(startIntent(B.class)
).
Details: launchMode singleInstance 创建新任务中的单例活动 https://developer.android.com/guide/topics/manifest/activity-element.html#lmode(任务 = 具有相同组 ID 的活动集,即affinity https://developer.android.com/guide/topics/manifest/activity-element.html#aff,通常应用程序活动具有相同的亲和力 i。 e.应用程序=单个任务)。
Drawback: 过渡动画不适用于 singleInstance 模式。看来 singleInstance 任务可能没有在动画时完全初始化。更多细节:自定义动画不适用于 SingleInstance Activity https://stackoverflow.com/questions/42144203/custom-animation-doesnt-work-on-singleinstance-activity.
将活动状态保存到 SharedPreferences
将活动状态保存到SharedPreferences
在“后按”上,从首选项恢复活动状态onCreate(Bundle)
就像下面的链接一样将活动状态保存到 SharedPreferences https://stackoverflow.com/questions/12171320/save-the-state-when-back-button-is-pressed.
Drawback: 无法保存Bundle
状态(仅限原语:putInt
, putString
, ...).
Others
中列出的一些方法在活动之间共享数据 https://stackoverflow.com/questions/4878159/whats-the-best-way-to-share-data-between-activities#answer-4878259可以使用。此链接的答案指的是developer.android.com/guide/appendix/faq/framework.html http://developer.android.com/guide/appendix/faq/framework.html不幸的是它被打破了。这是一个替代来源http://wing-linux.sourceforge.net/guide/appendix/faq/framework.html http://wing-linux.sourceforge.net/guide/appendix/faq/framework.html.
关于通过Application对象共享数据:
似乎将数据放入Application
对象或静态单例到目前为止是最佳解决方案对于这个问题。
QUESTION
有没有build-in解决方案(无需覆盖onBackPressed()
)?例如,将活动及其状态保存在后台堆栈上。如果不是,那是什么共同模式在这种情况下保存活动状态?
相关文章(只是为了将它们与这篇文章链接起来)
如何在 Android 上保存临时数据? https://stackoverflow.com/questions/25294879/how-do-i-save-temporary-data-on-android