【问题标题】:Activity lifecycle confusion活动生命周期混乱
【发布时间】:2014-09-20 12:56:58
【问题描述】:

我是 Android 开发新手,请原谅我的无知。

我有两个 activties,A + B。如果从 A->B 去,A 保持保留,它不会被破坏。当我从 B->A 返回时(使用后退按钮),活动 A 被销毁并再次创建,然后活动 B 被销毁。

我一直在寻找一种方法来保留活动 A,所以当我返回 B->A 时,A 会像原来一样被保留。我可以通过设置活动 A launchMode 来实现这一点,就像android:launchMode="singleTop"

谁能解释一下最初的行为?或者至少引导我阅读一些材料?为什么当我按回 B 时 A 被破坏了?

如果我想以编程方式实现android:launchMode="singleTop" 的效果,我应该在B 中捕获“Back”调用并使用自己的标志创建自己的Intent

将launchMode设置为singleTop是实现我想要的正确方法吗?

【问题讨论】:

  • 请发布您的清单。您看到的行为不正常,也不标准。发生了一些奇怪的事情。正常行为是:在 ActivityB 中按 BACK 将破坏 Activity B 并恢复现有的 ActivityA 实例。
  • @DavidWasser Manifest:pastebin.com/Rx74rZ28,此清单的行为,在 ActivityB = ActivityA Destroyed -> ActivityA Created -> ActivityB Destroyed 中单击返回。如果我将 android:launchMode="singleTop" 添加到 ActivityA(清单中的'Main'),则行为 = ActivityA 会恢复,而 ActivityB 会被销毁。
  • 清单看起来不错。您的 Activity 类是从 Android Activity 派生的还是使用了某些框架?

标签: android android-intent android-activity activity-lifecycle


【解决方案1】:

你有点困惑。您描述的情况与“向上”导航的行为相匹配。在您的帖子中,您描述了使用“返回”按钮(设备上的硬件按钮)从 B->A 开始。但是根据您的描述,您一定是在谈论“向上”按钮(屏幕顶部操作栏中的软“>”图标)。如果您想让 UP 导航使用活动 A 的现有实例(而不是创建新实例),则需要在清单中的活动 A 的 <activity> 定义中设置 launchMode="singleTop"

有关详细信息,请参阅documentation for UP navigation。以下是相关位的引用:

要在用户按下应用图标时向上导航,您可以使用 NavUtils 类的静态方法,navigateUpFromSameTask()。当你 调用此方法,它会完成当前活动并开始(或 恢复)适当的父活动。如果目标父母 活动在任务的后栈中,它被提前了。方式 它是否提出取决于父活动是否能够 处理onNewIntent() 呼叫:

  • 如果父Activity有启动模式<singleTop>,或者up Intent包含FLAG_ACTIVITY_CLEAR_TOP,父Activity为 被带到堆栈的顶部,并通过其接收意图 onNewIntent() 方法。
  • 如果父activity有启动模式<standard>,并且upintent不包含FLAG_ACTIVITY_CLEAR_TOP,父activity 从堆栈中弹出,并且该活动的新实例是 在堆栈顶部创建以接收意图。

【讨论】:

  • 谢谢你,终于一切都说得通了。我是 Android 开发的新手,我认为操作栏中的“UP”只是物理后退按钮的替代品,我猜不是。顺便说一句,如果我在我的应用程序的某些点覆盖“UP”的行为,可以吗?我有某种向导(一个活动,许多片段),我让“向上”导航通过片段而不是活动(直到它到达第一个片段,然后它通过活动导航),只是想知道该设计是否可行。
  • 一般情况下,BACK按钮应该返回上一步。 UP 导航应该返回到上一级或只是返回到起始屏幕。这只是一般规则。所有应用程序都有一些不同的要求。恕我直言,大多数用户将使用 BACK 按钮,而不是(如在 iPhone 上)使用 UP 导航。您的里程可能会有所不同;-)
【解决方案2】:
When I go back from B->A (using the back button), activity A gets destroyed and created again.  

我认为您看待上述概念的方式是错误的。

Activity A 永远不会被销毁,而是进入 Activity 生命周期的onStop() 状态,当用户按下返回按钮时,如果您知道 Activity 生命周期,它会恢复

当当前活动开始另一个活动时,新活动被压入堆栈顶部并获得焦点。 前一个活动仍保留在堆栈中,但已停止。当活动停止时,系统会保留其用户界面的当前状态。当用户按下后退按钮时,当前活动从堆栈顶部弹出(活动被销毁)并且上一个活动恢复(其 UI 的以前状态被恢复)。

编辑:

activity A gets destroyed and created again  

这在以下情况下是可能的:

  • 如果您在启动新活动时没有明确关闭第一个活动。

  • 如果您在第二个活动中覆盖 onBackPressed 以启动第一个活动。
    示例:

    @Override public void onBackPressed() { startActivity(new Intent(this, FirstActivity.class)); }

【讨论】:

  • 默认情况下,这不是正在发生的事情。我是根据观察来说话的。这是日志(不使用singleTop,一切都是默认的)。 09-20 09:23/com.x.x V/﹕ Activity A is created. Launched new activtiy: 09-20 09:23/com.x.x V/﹕ Activity B is created. Pressed Back: 09-20 09:23/com.x.x V/﹕ Activity A is Destroyed 09-20 09:23/com.x.x V/﹕ Activity A is created. 09-20 09:23/com.x.x V/﹕ Activity B is Destroyed
  • @lenix 查看您的 logcat 是可能的,但这取决于您编写的代码。如果您发布 ActivityAActivityB 的代码,我可以解释它
  • 我没有在启动 B 后明确关闭 A(没有调用 finish()),所以我想这有点解释了。现在的问题是,我怎样才能保留A? OP中提到的解决方案是否正确?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多