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

2023-12-22

我怎样才能保存活动状态(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 Object http://www.developerphil.com/dont-store-data-in-the-application-object/,
  • 使用Android Application类来临时保存数据 https://stackoverflow.com/questions/4208886/using-the-android-application-class-to-persist-data#answer-4209391.
  • 基于应用类 https://developer.android.com/reference/android/app/Application.html文档,使用静态单例 over Application is 更优选.

    用于维护全局应用程序状态的基类。 ...

    Note:通常不需要子类化应用程序。在大多数情况下, 静态单例可以以更加模块化的方式提供相同的功能 方式。如果您的单例需要全局上下文(例如注册 广播接收器),包括 Context.getApplicationContext() 作为 调用单例的 getInstance() 方法时的上下文参数。

似乎将数据放入Application对象或静态单例到目前为止是最佳解决方案对于这个问题。

QUESTION

有没有build-in解决方案(无需覆盖onBackPressed())?例如,将活动及其状态保存在后台堆栈上。如果不是,那是什么共同模式在这种情况下保存活动状态?

相关文章(只是为了将它们与这篇文章链接起来)

如何在 Android 上保存临时数据? https://stackoverflow.com/questions/25294879/how-do-i-save-temporary-data-on-android


对于处理此问题的另一种方法,您可以将视图的状态映射到数据结构,并将其作为对象表示法(例如 json)保存到本地,当创建/重新创建 Activity 时,您可以从本地读取状态并将它们与您的观点结合起来。

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

如果您需要保存活动中的数据,您可以使用Local Db or in-memory cache.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向后移动/导航时如何存储/恢复活动状态 的相关文章

随机推荐

  • 如何在 Python 和 Opencv 中检测八边形形状

    我正在研究一个shape检测算法opencv in python 我正在使用库中的轮廓 并且已成功检测到一些形状 圆形 矩形和三角形 唯一的问题是我只需要检测圆形 矩形和八边形 此外 这个圈子正在发挥作用 但不稳定 所以 这是我的代码 im
  • 在 Firebase Cloud Messaging 上通过 XMPP 传递上游消息的误解

    我正在尝试在我的应用程序中设置 FCM 功能 目前 我想显示一个按钮 以便当用户按下该按钮时生成一条上游消息 该消息被发送到 Google 的 CCS 据我了解 该上游消息将被 Google CCS 转换为 XMPP 节 然后 它将被传送到
  • jQuery post on window.unload(窗口或浏览器关闭)

    当用户以任何方式离开页面时 我需要发送一个发布请求 到目前为止 这就是我所拥有的 但它不起作用 window unload function post http localhost project quizTime php action u
  • ElasticSearch:如何禁用所有分片的分片重新分配?

    我为elasticsearch开发了一个搜索插件 但是在升级这个插件时 我需要一个一个地关闭节点 并且每次都需要等待很长时间的重新分配过程 在文件中 它说可以通过以下方式停止重新分配过程 curl XPUT localhost 9200 c
  • 如何在 WPF 中创建/制作圆角按钮?

    我需要创建一个圆角光泽按钮在 WPF 中 谁能解释一下需要什么步骤吗 我知道这篇文章非常旧 但我有一个答案 上面令人惊讶地缺失了 而且比大多数答案简单得多
  • Python 中的 return 是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在整个互联网上搜索了这句话的含义return陈述 我知道它结束了定义语句 但我知道它仍然做了其他事情 它还有什么作用 It return
  • 电子邮件中正确的换行符是什么? LF 还是 CRLF?

    最近 一些客户抱怨他们收到乱码电子邮件 显示 MIME 标头和 Base64 编码数据等 这些内容应该由邮件客户端解码 经过调查 我发现一些邮件客户端 例如 gmx de webmail 在每隔一行之后插入一个空行 因此确实搞乱了一切 凭直
  • 从 golang 结构体生成 proto 文件

    我有一个 golang 结构 其中包含对其他一些结构的引用 是否有一种自动方法从结构生成 proto 文件 例如 type A struct a int b B type B struct c C type C struct x int 应
  • 日期代码在 JS 中不起作用

    我敢打赌这真的很愚蠢 但我很累 想快速逃脱 所以请纵容我 目标是能够向由字符串构造的日期添加任意天 例如2015 01 01 firstDate 2015 01 01 var t1 date new Date firstDate t1 da
  • 如何透视 MS Access 表

    我有以下内容Data 表 人 我怎样才能重现以下内容Results 不 没有订单 也没有 ID 这是由一个存储基本数据的普通人完成的 我正在尝试生成这些结果以将其存储到 postgres 服务器中 我看到了分区的使用 但实际上我不知道如何以
  • 使用 Enter 键导航到 AG-Grid 中下面的单元格

    我们需要编辑单元格导航AG Grid但我没有找到一种方法来做我们需要的事情 这不是一个巨大的变化 但对我们的用户来说却是至关重要的变化 我们需要的导航规则类似于Google Spreadsheet单元格导航 应适用以下规则 紧迫enter将
  • Chrome 如何获取设备方向信息?

    我正在阅读有关 Chrome 能够获取设备方向信息的文章 Engadget 文章 http www engadget com 2010 07 06 google chrome gets some early device orientati
  • Mongodb 聚合计数数组/集合大小

    这是我的问题 Model 应用程序 abc 日期 Time now 状态 1 user id id1 id2 id4 应用程序 abc 日期 Time yesterday 状态 1 user id id1 id3 id5 应用程序 abc
  • masm除法溢出

    我正在尝试在汇编中除两个数字 我正在用英特尔计算机书的尔湾大会工作 我无法让部门为我的一生工作 这是我的代码 code main PROC call division exit main ENDP division PROC mov eax
  • 在 Shiny 中居中自定义数据表容器列标题

    我在这里遵循示例 2 5 https rstudio github io DT https rstudio github io DT 在闪亮中创建自定义数据表容器 该示例本身似乎运行良好 但是当我尝试在闪亮的应用程序中运行它时 萼片和花瓣标
  • 从 OneDrive 下载公开共享的文件

    当我在 UI 中使用 任何拥有此链接的人都可以查看此项目 选项创建共享链接时 我得到的 URL 如下所示https onedrive live com redir resid XXX YYYY authkey ZZZZZ ithint
  • AWS Lambda 函数使用 AWS SAM 3 秒后超时

    我是 AWS 和 Go 的新手 我正在尝试通过 AWS SAM CLI 执行我的 Lambda 函数 但每次我尝试这样做时都会收到以下错误 I0517 07 51 11 052078 13 main go 62 Thumbnail Lamb
  • 以编程方式设置菜单中的可见性 android

    所以 这就是我想知道的 如何在 Android 中以编程方式设置菜单的可见性 这就是我的菜单 public boolean onCreateOptionsMenu Menu menu MenuInflater inflater getMen
  • Spring Data JPA 中的错误:Spring Data 返回 List 而不是 List

    我通过 spring data 实现了 DAO public interface TestDataRepository extends CrudRepository
  • 向后移动/导航时如何存储/恢复活动状态

    我怎样才能保存活动状态 B 当搬到之前的活动 A 以及当移回 到活动 B 时如何恢复它之前的状态 SCENARIO 活动B的内容可以由用户更改 完成工作后 可以进行更改坚持 例如保存到本地数据库 在坚持之前 用户可能想要导航回之前的活动 此