移至上一个活动(A)时如何保存活动状态(B),以及移回(移至活动B)时如何恢复其先前状态?
场景
活动B的内容可以由用户更改。在完成工作之后,所执行的更改可以被持久保存(例如,保存到本地DB)。在保留之前,用户可能需要导航回到上一个活动。此时,“工作会议”应该以某种方式临时保存在内存中。返回活动B后,应恢复“工作会话”,以便用户可以继续工作。
方法
当设备配置改变时(例如在旋转时),标准方法onCreate(Bundle)
和onSaveInstanceState(Bundle)
用于恢复/保存活动状态。作为onSaveInstanceState(Bundle) is not part of activity's life-cycle,销毁活动(默认情况下调用finish()
)时,不会在“按下”时调用此方法。 onRestoreInstanceState(Bundle)也是如此。显然,仅这些方法不足以在离开活动后恢复活动状态。
在活动之间转移捆绑包状态
我可以想到的一种方法是重写onBackPressed()
,这样它将以当前活动B的捆绑状态Intent
开始Intent#putExtras(Bundle)
到先前的活动A。回退时,开始将Intent
转到活动B,此捆绑包状态将被传递回Intent#putExtras(Bundle)
以恢复活动B的状态。但是,这还需要在A中覆盖onCreate(Bundle)
和onSaveInstanceState(Bundle)
,因此在导航回到B之前,配置更改不会丢失B的捆绑包状态。
未完成后按+非默认launchMode上的活动
另一种方法(更简洁)是重写onBackPressed()
,以便它将在不调用当前活动B的Intent
的情况下开始finish()
到先前的活动A,因此活动B将以暂停状态(等待恢复)挂在内存中。要恢复活动B,必须配置清单配置android:launchMode="singleInstance"
,以便Android在导航回活动B(startIntent(B.class)
)时将使用现有活动(暂停的B),而不是创建新的活动(B2)。
详细信息:launchMode singleInstance创建singleton activity in new task(任务=具有相同组ID的活动集,即affinity,通常应用程序活动具有相同的相似性,即app =单个任务)。
缺点:过渡动画不适用于singleInstance模式。似乎singleInstance任务可能无法在动画时完全初始化。有关更多详细信息:Custom animation doesnt work on SingleInstance Activity。
将活动状态保存到SharedPreferences
在“按下”时将活动状态保存到SharedPreferences
,从onCreate(Bundle)
中的首选项恢复活动状态,如以下链接Save activity state to SharedPreferences所示。
缺点:无法保存Bundle
状态(仅原语:putInt
,putString
,...)。
其他
可以使用Share data between activities中列出的某些方法。来自此链接的答案是指developer.android.com/guide/appendix/faq/framework.html,很遗憾,该地址已损坏。这是替代来源http://wing-linux.sourceforge.net/guide/appendix/faq/framework.html。
关于通过Application对象共享数据:
Don't Store Data in the Application
Object,
Using the Android Application class to temporary persist data。
根据Application class文档,更优选在Application
上使用静态单例。
用于维护全局应用程序状态的基类。 ...
注意:通常不需要子类化Application。在大多数情况下,
静态单例可以提供更多模块化的相同功能
办法。如果您的单身人士需要全局背景(例如注册)
广播接收器),将Context.getApplicationContext()作为
调用单例的getInstance()方法时的上下文参数。
到目前为止,将数据放入Application
对象或静态单例似乎是解决此问题的最佳解决方案。
题
是否有任何内置解决方案(不需要覆盖onBackPressed()
)?例如,使用状态将活动保存在堆栈上。如果不是,在这种情况下保存活动状态的常见模式是什么?
相关帖子(只是将其与此帖子链接)
How do I save temporary data on android?
最佳答案
作为处理此问题的另一种方法,您可以将视图的状态映射到数据结构并将其另存为对象符号(例如json)到本地,当创建/重新创建活动时,您可以从本地读取状态并将它们与您的观点绑定在一起。
有关更多信息和示例,您可以查看Spotify's
演示文稿和开源项目,该项目包含有关它们如何通过api管理应用程序ui的信息。 (我知道这并不是您要尝试做的事情,但您可能会发现一些窍门。)
如果需要在活动中保存数据,则可以使用Local Db
或in-memory cache
。
关于android - 向后移动/导航时如何存储/恢复 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45282755/