使用navigateUpFromSameTask()从活动返回

2023-11-26

我有两个活动 A 和 B。当活动 A 首次启动时,它会访问Intent传递给它(因为Bundle is null,因为它应该是第一次通过),并相应地显示信息:

CustInfo m_custInfo;
...
protected void onCreate(Bundle savedInstanceState)
{
    ...
    Bundle bundle = (savedInstanceState == null) ? getIntent().getExtras() : savedInstanceState;
    m_custInfo = (CustInfo) m_bundle.getSerializable("CustInfo");
    if (m_custInfo != null
        ...
}

第一次这样做效果很好。这EditText控制和ListView已正确填写。

现在,当单击列表中的某个项目时,将启动活动 B 以显示详细信息:

m_custInfo = m_arrCustomers.get(pos);

Intent intent = new Intent(A.this, B.class);
intent.putExtra("CustInfo", m_custInfo); // CustInfo is serializable
// printing this intent, it shows to have extras and no flags

startActivityForResult(intent, 1);

在活动 B 开始之前,框架会调用 A 的重写onSaveInstanceState():

protected void onSaveInstanceState(Bundle outState)
{
    super.onSaveInstanceState(outState);

    outState.putSerializable("CustInfo", m_custInfo);
}

在活动 B 中,当按下操作栏中的向上按钮时,我想返回到活动 A 并使其处于与之前相同的状态:

public boolean onOptionsItemSelected(MenuItem item)
{
    if (item.getItemId() == android.R.id.home)
    {
        Intent intent = NavUtils.getParentActivityIntent(this);
        // printing this intent, it shows to have flags but no extras

        NavUtils.navigateUpFromSameTask(this); // tried finish() here but that created an even bigger mess
        return true;
    }
    ...
}

问题就在这里,当在onCreate()第二次进行活动 A 时,Bundle参数是null and getExtras()回报null。自从onSaveInstanceState()被叫了,我本以为Bundle参数为非null.

我在其他网站上读到过有关此问题的信息,并尝试过这些建议,但没有任何效果。


如果您希望您的应用程序以这种方式做出反应,您应该将 Activity A 的启动模式声明为:

android:launchMode="singleTop"

在您的 AndroidManifest.xml 中。

否则 android 使用标准启动模式,这意味着

“系统总是在 目标任务”

并且您的活动将被重新创建(请参阅安卓文档).

使用 singleTop 时,如果现有活动位于任务返回堆栈的顶部,系统将返回到您现有的活动(带有原始的额外活动)。在这种情况下不需要实现onSaveInstanceState。

在您的情况下,savedInstanceState 为 null,因为您的活动之前并未被操作系统关闭。

Notice(感谢 Android 开发者指出this):

虽然这是问题的解决方案,但如果返回的活动是not在返回堆栈的顶部。 考虑这样的情况:活动 A 启动 B,B 又启动 C,并且 C 的父活动配置为 A。 如果你打电话NavigateUpFromSameTask()从 C 开始,活动将被重新创建,因为 A 不在堆栈顶部。

在这种情况下,可以使用这段代码来代替:

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

使用navigateUpFromSameTask()从活动返回 的相关文章

  • 使用系统签名的应用程序关闭 Android 设备电源

    我正在开发一个Android应用程序 我们需要在某些情况下关闭设备电源 我在很多地方都读到过 您需要有 root 权限的手机才能执行此操作 然后 您可以使用 Java 的 API 发出 rebo ot 命令 try Process proc
  • Android 是否可以使用并发插值器?

    我有一组两个动画 两个动画使用过冲插值器一起运行
  • android 中的自定义 MediaPlayer 类

    我刚刚完成了一个项目 我使用网络视图进行视频播放 现在我被要求用自定义播放器替换 webview 部分 玩家应该能够处理 HLS 如果我使用VideoView和MediaController 我可以播放直播 但不幸的是 MediaContr
  • 设备管理员禁用

    如果不是 则无法卸载设备管理应用程序 禁用 用户可以从设置中禁用 设备管理员 当公司向员工提供 Android 设备时 公司希望 可以控制设备及其状态和策略 但用户可以 轻松摆脱这种控制 有谁知道这怎么可能 防止用户禁用设备管理员 谢谢 无
  • Android 版 Qt 和 BoringSSL

    我正在开发一个基于 Qt 的 Android 应用程序 它使用 QSslSocket 下载数据 由于 Android 从 OpenSSL 转向 BoringSSL 因为依赖 OpenSSL 库的 Marshmallow Qt 程序在 And
  • 解析dev/input/event触摸事件

    我能够在 Android 手机上从 dev input event 读取事件 然而 它们是按一定顺序排列的行代码 就像触摸事件给出的那样 3 53 216 3 54 444 3 48 40 3 50 5 0 2 0 0 0 0 如何将它们解
  • 原包AndroidManifest属性有什么用?

    我使用 apktool 提取 Jelly Bean 上默认浏览器的清单 清单中出现了这一行
  • Android 7 GraphicBuffer 替代方案,用于直接访问 OpenGL 纹理内存

    从移动设备具有 CPU 和 GPU 共享内存这一事实中获利的唯一方法是使用GrphicBuffer 但由于 Android 7 限制对私有本机库 包括 gralloc 的访问 因此无法再使用它 问题 是否有其他方法可以直接内存访问纹理的像素
  • 如何获取另一个应用程序的版本名称

    我想获取 Minecraft Pocket Edition 的版本名称 示例 0 13 0 b5 这是MCPE 我的世界袖珍版 的包 com mojang minecraftpe 我想要版本为String 我怎样才能做到这一点 我的获取包名
  • 如何在 android 中的 facebook、whatapp、instagram 和其他平台上分享推荐代码

    我有一个屏幕 用户可以通过该屏幕在 Facebook WhatsApp Twitter 和 Instagram 上分享推荐代码 我已经有一个 API 来生成推荐代码 现在我正在浏览branch io 文档 但我能找到的只是深层链接 我无法理
  • Android:RecyclerView 项目上下文菜单问题

    我正在尝试实现一个 RecyclerView 单击每个项目时 都会弹出一个上下文菜单 我已引用此的答案 评论question https stackoverflow com questions 26466877 how to create
  • JSch:如何使用 ssh 密钥 ssh 到服务器

    我想从另一个 ssh 服务器后面 ssh 进入服务器 网关服务器需要用户名 密码 我可以做到这一点 我正在使用隧道进入下一台服务器 但这需要only一个 ssh 密钥 我已经通过 PuTTY 生成了密钥 因此它存在于我的用户名中 但我不确定
  • Android 浏览器缩放?

    我正在尝试为 Android 创建一个移动网站 当我将主体宽度设置为 480px 屏幕宽度 时 结果比我预期的大 50 左右 看来 android 正在缩放它所绘制的内容并弄乱了我所有的布局 有谁知道如何禁用它或解决它 我已经在使用这个 您
  • Android Studio SDK 安装程序在解压缩“platform-tools/systrace/NOTICE”时无限期挂起

    adb 无法从命令提示符处使用 设置了正确的路径 我认为平台工具的原始安装出现了问题 Studio 告诉我更新 但每次都会发生这种情况 我的机器上似乎缺少 adb exe this is the android studio event l
  • 将 wgs 84 转换为纬度/经度

    你好 我在弄清楚如何在坐标类型之间进行转换时遇到了一些麻烦 我有一个坐标集列表 其描述如下 坐标始终采用 WGS84 系统 所有坐标 a 均表示为整数 值 x 和 y 其中坐标值乘以 1 000 000 一个例子 559262 631951
  • 如何在Android中编辑文本时限制文本的数字仅在0-59之间?

    我有一个Edit Text其中数字只能介于0 59 不会再输入其他数字Edit Text 我试过text watcher但没有获得成功 任何想法 12 26 14 59 39 715 E AndroidRuntime 19494 FATAL
  • 使用 Swift 在 iOS 和 Android 之间共享核心代码

    我想要的是 使用 Swift 在 Android 和 iOS 之间共享非 UI 代码 问题 Android 具有 NDK 支持 允许您使用 Java 本机接口 JNI 运行 C 和 C 代码 不是 Objective C 我是一名Java程
  • 如何禁用 Google 请求许可定期检查手机上已安装的应用程序?

    我正在开发一个 Android 应用程序 因此我不断地在我的测试设备上构建和安装该应用程序 几天以来 我在每次构建 安装时都会提出一个问题 Google 可能会定期检查已安装的应用程序是否存在潜在危害 行为 在 Google 设置 gt 验
  • 除了前一个按钮意图之外,如何添加另一个按钮意图?

    这是我的代码 它包含一个名为的按钮button1A当我单击它时 它会打开一个名为的列表list1 如何为另一个名为 button2A 的按钮添加代码 该按钮将打开一个列表 List2 import android os Bundle imp
  • 在 Android 上使用 Excel 文件

    我正在开发一个应该能够创建 读取和写入 Excel 文件的模块 是否有 推荐 轻量级 Java 库用于处理可以在 Android 上运行的 Excel 文件 欢迎提出建议 Thanks 找到一个

随机推荐