移动/导航回

时间:2017-07-24 14:08:55

标签: android android-intent android-activity

如何在移至之前的活动(A)时保存活动状态(B),以及如何在返回时将其恢复到之前的状态(至活动B)?

情景

活动B的内容可以由用户更改。完成工作后,执行的更改可以保留(例如保存到本地数据库)。在持久化之前,用户可能希望导航回以前的活动。此时,"工作会议"应以某种方式保存临时内存。返回活动B"工作会议"应该恢复,以便用户可以继续工作。

途径研究

标准方法onCreate(Bundle)onSaveInstanceState(Bundle)用于在设备配置更改(例如,旋转)时恢复/保存活动状态。作为onSaveInstanceState(Bundle) is not part of activity's life-cycle,此方法不会被调用" back-press"当活动被销毁时(默认情况下调用finish())。这同样适用于onRestoreInstanceState(Bundle)。显然,仅仅这些方法不足以在提取活动后恢复活动状态。

在活动之间转移捆绑状态

我能想到的一种方法是以这样的方式覆盖onBackPressed(),它会以当前活动B的捆绑状态Intent开始Intent#putExtras(Bundle)到之前的活动A.返回时,从Intent开始到活动B,此捆绑包状态将被传回Intent#putExtras(Bundle)以恢复活动B的状态。但是,这还需要覆盖A中的onCreate(Bundle)onSaveInstanceState(Bundle)因此在导航回B之前,配置更改不会丢失B的捆绑状态。

未完成背压+非默认启动模式

的活动

另一种方式(更清洁)是覆盖onBackPressed(),以便它可以在不调用当前活动B的Intent的情况下启动finish()到之前的活动A,因此活动B将在内存中挂起暂停状态(等待恢复)。要恢复活动B,需要清单配置android:launchMode="singleInstance",以便在导航回活动B(startIntent(B.class))时,android将使用现有活动(暂停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?

2 个答案:

答案 0 :(得分:0)

有关处理此问题的替代方法,您可以将视图的状态映射到数据结构,并将其作为对象表示法(例如json)保存到本地,并且在创建/重新创建活动时,您可以阅读来自本地的州,并将其与您的观点联系起来。

有关更多信息和示例,您可以查看Spotify's演示文稿和开源项目,其中包含有关如何从apis管理应用程序的ui的信息。 (我知道这不是你想要做的,但你可能会发现一些技巧。)

如果您需要在活动中保存数据,可以使用Local Dbin-memory cache

答案 1 :(得分:0)

当您退出活动时,活动不仅会以编程方式销毁,还会在概念上销毁。换句话说,用户希望消失。我们讨论了在活动对象被销毁但用户认为它仍然存在的情况下保存活动状态,例如在配置更改期间或在后台或后台堆栈中。

您尝试保存的内容被恰当地视为应用程序状态,而不是活动状态。因此,SharedPreferences是适合它的地方。它是否是最佳解决方案是一个意见问题,取决于您的使用案例。