生命周期困境与另一项活动的方向变化

2024-03-08

我在 tabhost 中有 2 项活动。在 Activity1 中,我处理方向变化以及用户在 Activity 之间切换时的情况。

当用户从 Activity1 切换到 Activity2(通过选项卡选择)、执行方向更改,然后切换回 Activity1 时,问题就会出现。当 Activity2 可见时,我对 Activity1 中发生的生命周期事件感到有点迷失。

根据调试器的信息,以下是我的 Activity1 中发生的事件顺序:

=== 方向改变 ===
保存实例状态
onPause
onStop
创建时
onStart
恢复实例状态
恢复时

=== 切换到活动 2 ===
保存实例状态
暂停时

=== 在活动 2 中改变方向 ===
onStop
创建时
启动时

=== 从 Activity2 切换回 ===
恢复时

正如您所看到的,当切换到 Activity2 时,我有机会在对 onSaveInstanceState 的调用中保存 Activity1 数据,但我从未调用 onRestoreInstanceState 来恢复它。

问题

  1. 如果 android 不打算在切换回来时调用 onRestoreInstanceState,为什么它会在切换到另一个 Activity 时调用我的 onSaveInstanceState?

  2. 为什么当 Activity2 可见时,我的 Activity1 中看不到 onSaveInstanceState/onRestoreInstanceState?我仍然必须保存/恢复数据,无论它是否可见,是吗?

  3. 在这种情况下,保存/恢复数据最安全的地方在哪里?如果它不在 onSaveInstanceState/onRestoreInstanceState 中,我如何访问该包进行恢复?

  4. 是否有其他解决方案(如其他回调)我可以利用来缓解这种情况?

谢谢你的帮助!

Greg


这是一个非常好的问题。

查看 onSaveInstanceState/onRestoreInstanceState 的文档,它们的目的(以及默认实现的行为)是保存任何具有 ID 的视图的视图状态。例如,如果选中复选框,则选择单选组中的哪个单选按钮等等。

文档中还指出,当 Activity“重新设置”时,为 onSaveInstanceState 创建/保存的 Bundle 将传递给 onCreate 和 onRestoreInstanceState(稍后会详细介绍)。

我猜测,由于 Activity 1 在旋转时隐藏,因此不会调用 onRestoreInstanceState,因为没有“视图”(即,它无法被看到/查看)。此外,完全有可能有 2 个完全不同的纵向/横向布局文件,它们可能具有具有不同 ID 的不同 UI 元素。

因此,我想说,如果您想在 onSaveInstanceState 中使用 Bundle 来保存您自己的数据,那么您需要在 onCreate(在 Activity 1 中)中添加额外的逻辑来处理您自己的数据(以及执行此操作)有条件地在 onRestoreInstanceState 中)。

特别是,您可以维护一个“最后已知”方向字段,以便 onCreate 知道它需要处理您自己的数据,因为方向已更改,而不是依赖于调用 onRestoreInstanceState。

这有任何意义吗?这是我解释逻辑的唯一方法。

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

生命周期困境与另一项活动的方向变化 的相关文章

  • 如何在android中使用Ontouchevent突出显示此pdf页面

    这里我想使用android中的onTouchevent来突出显示这段文字 您可以使用 OnTouchListener 来获取事件的 x 和 y 然后将屏幕绘制为位图 并根据字母的左上角显示和字母的大小使用bitmap getPixel 看看
  • 测试权限和 Android 应用清单文件

    我想知道是否有办法添加某些权限 或任何东西 到 android 清单文件 但这样它仅在测试运行期间使用 不在生产期间使用 我正在寻找一些程序化的东西 而不是在测试时剪切和粘贴 这是上下文 我正在读这篇文章 http developer an
  • 在 Android 中设置 Signalr:崩溃/挂起问题

    我跟着本教程 https whathecode wordpress com 2014 03 20 getting started with the java signalr sdk 为我的 Android 应用程序设置一个 NET 后端来实
  • 无法创建新的远程会话。阿皮姆

    public class StartFirstJobTest AppiumDriver driver BeforeTest public void setUp throws Exception DesiredCapabilities cap
  • ViewPager 具有不同的纵向和横向适配器

    在纵向模式下 我的ViewPager有 3 个片段 A B C 但在横向模式下 它只有 2 个片段 A 和 C 所以我创建了 2 个FragmentStatePagerAdapters 代表每种模式 问题是当屏幕方向改变时 ViewPage
  • NativeActivity未完成

    我从 JavaActivity 调用 NativeActivity 我的 NativeActivity 的入口点是 android main struct android app state 最后 我打电话给 ANativeActivity
  • 如何使用 Retrofit 2 下载 pdf 文件

    我在下载带改造的 pdf 文件时遇到困难 我的代码生成了一个文件 但它的大小错误 并且当 pdf 打开时它是空白的 这就是我的 php web 服务返回 pdf 文件的方式 param Slim Slim app param String
  • 创建 Android 智能应用横幅

    Android 设备有类似 iOS 6 智能应用横幅的解决方案吗 这是智能应用横幅的代码 从 Chrome 44 Beta 开始 您可以在 Android 版 Chrome 中推送您的应用程序 您网站上的本机应用程序安装横幅 请看下面的答案
  • 任务“:app:checkReleaseDuplicateClasses”执行失败。扑

    请找到以下文件 1 应用程序 构建 gradle def localProperties new Properties def localPropertiesFile rootProject file local properties if
  • android:如何将图像添加到相册

    任何人都可以分享代码 或向我指出 Android 示例代码 来帮助我将图像添加到媒体商店 图库 中的相册中 在我的应用程序中 我从服务器下载图像 并使用相机 通过 Intent 拍摄新图像 我想将这些图像组织在特定于应用程序的相册中 类似于
  • Intent.ACTION_DIAL 号码以 # 结尾

    所以我尝试通过以下方式发送号码Intent ACTION DIAL以 结尾 例如 123 但是当Android Dialer应用程序启动时 只有 123 不见了 我正在使用以下代码来触发 Android 的拨号应用程序 Uri number
  • 如何在 Android WebView 中从远程 URL 访问本地资源?

    要加载 HTML 中的资源 我使用 URLfile android asset my image png 当我在本地加载 HTML 时 它可以工作 例如 使用WebView loadData method 但是 我无法从远程网站加载本地资源
  • 如何使用带有 ListView 和自定义适配器的选择器来指示所选项目

    我有一个具有 ListView 的活动 并且我创建了一个自定义适配器 基于BaseAdapter 自定义适配器的 GetView 方法使用自定义布局 view context LayoutInflater Inflate Resource
  • Google Play Services V2 库中的 NoClassDefFoundError

    在按照以下步骤尝试使用 Google Play Services V2 库时 出现以下异常官方教程 https developers google com maps documentation android start java lang
  • Android 上页面留在后台时会触发“beforeunload”事件

    我正在尝试制作一个在导航时弹出的简单加载微调器 它在导航离开时使用 beforeunload 事件显示 并在完成后使用 load 事件再次隐藏自身 问题是 当我将页面留在手机后台时 例如几个小时后 beforeunload 事件触发并显示微
  • 执行选项卡切换时避免重新创建相同的视图

    目前 我有 2Fragments 可通过以下方式切换ActionBar s tab getSupportActionBar setNavigationMode ActionBar NAVIGATION MODE TABS ActionBar
  • 如何以编程方式滚动 Horizo​​ntalScrollView

    我有一个HorizontalScrollView其中包含一个RelativeLayout 该布局在 XML 中为空 并由 onCreate 中的 java 填充 我希望这个滚动视图最初位于中间的某个位置RelativeLayout 它比屏幕
  • Robotium 和系统对话框

    当我尝试与蓝牙设备配对时 会出现带有 PIN 码的系统确认对话框 有 取消 和 确定 按钮 但我无法使用 Robotium 单击它们 如何在 Robotium 中使用 Android 操作系统对话框 谢谢 这对我有用 solo clickO
  • 安卓应用安全

    我想开发一个用户数据非常敏感的应用程序 我是开发新手 所以不确定以下内容 技术对于安全或高效来说是必要的 请留下您的评论 提前致谢 为了额外的安全性 我们可以避开市场 游戏商店 并将应用程序安装在个人设备上 它会让它更安全吗 我必须在设备上
  • 根据内容对列表视图中的相似行进行分组

    i have a listview that displays a set of rows each row is clickable now i wish to group similar type of rows under one h

随机推荐

  • Python Matplotlib - 未对齐的网格线和颜色填充

    我使用以下代码来生成一种二进制热图 import numpy as np import matplotlib colors as mlc import matplotlib pyplot as mlp states AAAA BBBB CC
  • 使用 Rails 连接到 Web 服务(HTTP 请求)?

    我正在使用 Ruby on Rails 3 并尝试实现 API 以从 Web 服务检索帐户信息 也就是说 我想连接到具有 Account 类的 Web 服务并从show在 URI 处路由的操作http
  • 带有绝对路径的“没有这样的文件或目录”

    我想导入 png 文件 import matplotlib pyplot as plt O plt imread C Users myusername Downloads Mathe Picture png 我有绝对路径 但它仍然给我错误
  • 如何从一个类调用另一个类的方法(iOS)

    这是一个非常基本的问题 但我进行了全面搜索 但无法找到一个足以让我理解的答案 我想要做的是在我的 iOS 应用程序的一个类中创建一个方法 然后从我的应用程序中的其他类调用该方法 有人可以准确解释我需要做什么才能实现这一目标吗 任何帮助将不胜
  • HTML5 拖放在拖动时更改光标(不使用 UI)

    我想改变cursor拖动时 所以我尝试这样 function drag event localStorage setItem no event target data no html css cursor move tr class mem
  • 使 Python 脚本与 xargs 一起工作

    让我的 Python 脚本与 xargs 良好配合的过程是什么 例如 我希望以下命令能够处理文本文件的每一行 并执行任意命令 cat servers txt hardware py m 本质上希望将每一行传递给 hardware py 脚本
  • 从 Java 写入 XML 文档 - 简单

    我知道 stackoverflow 上有很多关于从 Java 编写到 XML 的问题 但它太复杂了 我觉得我有一个非常简单的问题 但我无法弄清楚 因此 我有一个程序需要大量用户输入 并且当前正在创建并附加带有结果的文本文档 我将在这里发布我
  • 具有附加可绑定字段的 ASP.NET Server 控件

    我创建了一个自定义服务器控件 源自System Web Contols CheckBoxList定制如何CheckBoxList被渲染 我还想添加另一个可绑定字段并获取该字段的值CheckBoxList RenderItem 方法 我想要创
  • 构建时 PNG 生成不支持对其他资源的引用

    AndroidStudio 3 0 Android Gradle 插件 3 0
  • TableLayout中表行的索引

    我有一个 TableLayout 和一些未知数量的 TableRows 它们是根据数据库中的内容生成的 每行都附加了一个 OnClick 侦听器 但是 一旦发生单击 我就无法 有意义地 分辨它来自哪一行 有没有一种方法可以获取与 Table
  • lib 依赖项及其顺序

    有时 如果我们没有在 makefile 中按特定顺序列出库 则会失败 原因是 定义应该先于其使用 如何确定正确的顺序 实际上 在链接库时 使用应该在定义之前 在处理提供其定义的库文件之前 需要知道任何未解析的符号 恐怕您必须手动执行此命令
  • Facebook Graph API 返回空数据集

    我正在尝试使用 Graph API Explorer 为我的应用程序创建访问令牌 以使用 me accounts 查看我的页面 但是 每次我尝试此操作时 它都会返回一个空数据集 我已经选择了manage pages作为权限 但它仍然不起作用
  • 如何生成具有特定概率密度函数的随机数?

    我正在尝试对移动无线网络的阴影和快速衰落进行建模 对于快速衰落 瑞利衰落是一个合理的模型 信道响应的包络将是瑞利分布的 将该随机变量称为 R 其概率密度函数 PDF 为 PR r 2r exp r 2 r gt 0 2 2 http en
  • Hudson 和 Maven 的双单元测试报告

    我在 hudson 有一个 maven2 项目 当 cobertura 报告插件运行时 它会导致单元测试显示它们已经运行了两次 我不介意它们运行多次 但趋势图显示的测试数量是我们实际运行的两倍 有没有办法确保图表只显示一次 thanks J
  • Oracle 中的截断表出现错误

    我遇到的问题是 当我在 Oracle 中运行以下命令时 遇到错误 Truncate table mytable Errors ORA 02266 unique primary keys in table referenced by enab
  • 眼镜检测

    我想做的是测量眼镜框的厚度 我有一个想法来测量框架轮廓的厚度 可能是更好的方法 到目前为止 我已经勾勒出眼镜框的轮廓 但线条不相交处存在间隙 我考虑过使用 HoughLinesP 但我不确定这是否是我需要的 到目前为止 我已执行以下步骤 将
  • 来自私有 GitHub 存储库的 Cordova 插件

    从私有 GitHub 存储库安装 Cordova 插件的首选方法是什么 我从供应商处购买了一个私有插件 该供应商授予我的 git 帐户访问其私有 git 存储库的权限 通常我从 cordova cli 安装插件 cordova plugin
  • 如何比较两个数组,删除相似的项目,而不迭代整个数组?

    是否可以比较两个数组并删除相等的值 如果它们位于相同的索引 而不需要迭代两个数组 这是一个例子 array1 1 2 3 4 5 6 7 23 44 array2 1 1 3 4 5 7 6 23 45 array3 sudo compar
  • 提供 if 语句问题的函数返回

    我在从 golang 的 if 语句中返回函数的预期返回语句时遇到问题 我提供了以下代码 package main import fmt func random string var x return if x return return
  • 生命周期困境与另一项活动的方向变化

    我在 tabhost 中有 2 项活动 在 Activity1 中 我处理方向变化以及用户在 Activity 之间切换时的情况 当用户从 Activity1 切换到 Activity2 通过选项卡选择 执行方向更改 然后切换回 Activ