android - 向后移动/导航时如何存储/恢复 Activity 状态

标签 android android-intent android-activity

移至上一个活动(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状态(仅原语:putIntputString,...)。

其他

可以使用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 Dbin-memory cache

关于android - 向后移动/导航时如何存储/恢复 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45282755/

相关文章:

javascript - 使用媒体插件在 Android 中使用 Cordova/PhoneGap 播放本地音频

android - 如何在我的应用程序上为所有手机调用 Android 计算器

android - 像 any.do 一样的弹出窗口

android - 无法解析 : play-services-tasks

Java - 如何根据一定的长度分割字符串?

android 在屏幕上发现压力

android - 在 Android 中自动捕获图像

android - 尝试从本地文件安装 apk 时未发现 Activity 错误

java - 2 名玩家井字游戏

android - 如何获取应用中的主要 Activity 名称?