【问题标题】:How to return to the same activity instance after resuming it?恢复后如何返回到同一个活动实例?
【发布时间】:2011-06-12 16:25:59
【问题描述】:

这个问题有点奇怪,在尝试了大约一天之后,我将其发布在这里。 我有一个应用程序,其中活动 A(主要活动)启动其他活动(B、C 或 D)。 当活动 A 已启动活动 B 并按下“主页”按钮时,就会出现此问题。

案例 1 - 当我在我的设备 (HTC Desire) 上按“主页”按钮后在调试模式下测试我的应用程序时,我再次单击应用程序图标,它返回到相同的活动(活动 B),这就是是应该做的。这里没有问题。

案例 2 - 当我导出签名包,然后在同一设备上安装应用程序时,如果我在按下“主页”按钮后单击应用程序图标,则活动 A(主要活动)的新实例是在活动 B 的顶部启动。我知道这一点是因为当我从该活动按“返回”时,它返回到活动 B 并再次按“返回”显示活动 A。

如果应用程序以启动时的相同顺序退出,则该行为将不复存在,也就是说,如果我从活动 B 中按“返回”,然后从活动 A 中按“返回”(退出)。

在此之后一切正常。 我已经用不同的设置对其进行了多次测试,但我似乎无法弄清楚为什么会出现这样的行为。

感谢任何帮助。

【问题讨论】:

  • 只需将 logcat 用于签名前和签名后的 apk。
  • logcat 在这种情况下没有帮助,没有错误。
  • 行为是 A 启动 B --> 点击 'home' --> 点击应用启动器 --> A 再次被推送到应用堆栈上,现在是 A -> B -> A。是根活动。
  • OOOK...在敲了几个小时的头并尝试了所有可能的排列之后,我想通了。我正在使用 android 2.2 及其 apk 安装程序中的错误。我在 5 个应用程序上进行了尝试,都给出了相同的结果。 1--从你的 sdcard 中获取任何 apk 并安装 2-- 安装完成后,从显示“安装完成”消息的屏幕打开应用程序。 3-- 现在按“主页”按钮将应用程序置于后台 4-- 转到应用程序的图标并从那里打开它。现在你可以重复相同的过程来打开尽可能多的实例,重复
  • 你有没有找到任何解决方案,当我通过eclipse在kindle(2.3版本)中运行我的应用程序时也会发生同样的事情。在其他设备上它运行良好,没有问题。

标签: android android-activity onresume activity-lifecycle


【解决方案1】:

我认为在清单中为 Activity A 提供“单顶”标志应该可以解决此问题。

【讨论】:

  • 制作活动 SingleTop 无济于事。这可能有助于使活动 B 成为单一顶部。但默认情况下您不需要它,它应该将现有堆栈返回到屏幕。您的所有活动设置都是默认设置的吗?
  • 我确实尝试过制作活动 A singleTop 但它没有帮助。 @damluar:是的,所有活动设置都设置为默认值
  • singleTop 仅适用于次要活动。这是为了确保您不会启动您带到前面的任何内容的第二个副本(即堆栈的顶部)。 Top 不是应用的启动活动,是当前查看的活动。
  • 我误解了这个问题吗?用户不希望启动 Activity A 的第二个实例,对吗?
  • 是的,我不想要第二个实例,但正如我已经指出的那样,它是 apk 安装程序的问题。我已经在这里发布了这个行为 -> [link]devashish.co.in/2011/06/android-2-2-apk-installer-issue 如果有人能够复制这个,请告诉我
【解决方案2】:

关于案例 1: 从 Activity A 启动 Intent 以启动 Activity B 时,添加标志 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 这将确保当您回家并再次启动应用程序时,将显示 Activity A。

关于案例 2: 我不确定这将如何发生。似乎它认为您有两个版本的应用程序,签名版本和未签名版本,但将它们都保存在同一个任务堆栈中。如果您只需要一个实例,您可能需要考虑为您的 Activity 使用 singleTask 或 singleInstance。有关详细信息,请参阅tasks and back stack 上的文档。

【讨论】:

    【解决方案3】:

    关于案例 2 的可能原因,我同意 Noel 的观点。如果没有任务重父化或将其设置为阻止活动的多个实例的启动模式,则从 Home 启动它可能不会被视为与从 Eclipse 启动它(假设是这种情况)。

    在我的人才计算器应用程序中,我将整个应用程序设置为 allowTaskReparenting=true 以确保其他堆栈中没有任何内容(主要是电子邮件,因为它可以通过电子邮件发送启动 url)。然后我将我的主要活动设置为 launchMode="singleTask" 因为我只希望存在一个实例,无论启动它或出于何种意图。

    我唯一的其他活动是加载和保存,并且有 noHistory="true" 以确保它被删除并且永远不会返回。这基本上意味着它只在你在其中时存在,并且永远无法返回。

    clearTaskOnLaunch="true" 还将确保只有主 Activity 在从 Home 启动时保留在堆栈中,但如果您有其他方式进入您的 Activity,情况并非总是如此。如果它只从 Home 启动,则设置此项。

    希望对大家有所帮助。

    【讨论】:

    • (1.) allowTaskReparenting=true 和 launchMode=singleTask :即使我在活动 B 中按下“主页”按钮并再次单击应用程序启动器时,也会显示活动 A . (2.)allowTaskReparenting=true 和 launchMode=standard :给出与以前相同的结果。我想再次声明,这是第一次发生这种情况,当我通过从活动 A 中按“返回”退出应用程序时,问题消失了
    【解决方案4】:

    您是手动启动应用程序还是使用 Eclipse 或其他 IDE?从 Intellij IDEA 开始时,我遇到了完全相同的问题。然后我停止并手动运行它,并且行为符合预期。

    【讨论】:

    • 我正在使用 Eclipse 运行它。
    • 然后尝试通过应用管理手动停止它并手动运行它
    • 您的应用列表中有一个图标。您还可以将此图标添加到手机的主屏幕。要停止应用程序,您应该去设置和“管理应用程序”(是内存,可能是类似的东西)
    • 哦……我已经这样做了。我从“管理应用程序”菜单中卸载了该应用程序,然后将签名的 apk 放入 sd 卡中,从那里安装该应用程序,然后对其进行测试
    • 在您的第一个回复中,您告诉您使用 Eclipse 运行它,那是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2018-10-31
    • 2015-05-18
    相关资源
    最近更新 更多