【问题标题】:onActivityResult() & onResume() [duplicate]onActivityResult() 和 onResume() [重复]
【发布时间】:2011-09-22 00:53:55
【问题描述】:

谁能告诉我哪个先被调用,是onActivityResult() 还是onResume()? 示例:

Activity A 调用startActivityForResult() 启动Activity B。B 执行完成并返回结果给A,但是先调用A 的哪个方法,onActivityResult() 还是onResume()

我知道有人已经通过引用 Activity Docs 回答了这个问题,但是我自己在里面找不到。

【问题讨论】:

    标签: android


    【解决方案1】:

    首先调用onActivityResult() 然后onResume()

    引用自文档:

    受保护的 void onActivityResult (int requestCode, int resultCode, Intent 数据)

    自:API 级别 1 调用时调用 您发起的活动退出,给予 你启动它的 requestCode 与,它返回的结果代码,和 任何其他数据。这 resultCode 将为 RESULT_CANCELED 如果 该活动明确返回, 没有返回任何结果,或者崩溃了 在其运行期间。 您将收到 之前的这个电话 onResume() 当你的活动是 重新开始。

    【讨论】:

    • 截至目前,我的代码似乎在 onRestart 之前立即调用 onActivityResult :-/
    • 这些图表有助于理解 Activity 和 Fragment 的完整生命周期:github.com/xxv/android-lifecycle
    【解决方案2】:

    正如其他人所发布的,当您的活动重新启动时,onActivityResult() 会在 onResume() 之前调用。

    Diane Hackborn 解释说 onActivityResult() 在 onResume() 之前调用是为了允许在更新 UI 之前接收和使用可能影响 UI 的任何内容(大概是为了避免双重更新 - 一次在 onResume()没有返回结果,然后在onActivityResult()中,加上返回的结果)。

    https://groups.google.com/forum/?fromgroups=#!topic/android-developers/3epIML7fjGw

    这样做的一个后果是,您可能决定仅在 onResume() 中执行的任何初始化(例如,您需要新鲜的来自外部源的数据的初始化)而不是在 onCreate() 中,将在以下情况下未初始化对 onActivityResult() 的调用是重新启动应用程序的一部分,该应用程序已被操作系统从内存中清除(因为在 onActivityResult() 之前不会调用 onResume())。

    在这种情况下,onActivityResult() 必须准备好为 onActivityResult()使用的任何此类变量执行此类初始化。

    当然,如果 onActivityResult() 所需的初始化可以在 onCreate() 而不是 onResume() 中执行,那么由于在 onActivityResult() 和 onResume() 之前重新启动时都会调用 onCreate(),所以每次恢复应用程序时都不需要做的事情,这将是最简单的方法。但是,如果您正在初始化的数据来自外部来源并且您需要它是新鲜的,您可能希望在 onCreate() 和 onResume() 中初始化此类数据,并使用 onResume() 检查 onCreate 中设置的标志() 来查看数据是否刚刚在 onCreate) 中被初始化,然后在 onResume() 中更新它,如果它们没有被初始化。这样一来,它的某些年份将始终可用(至少在应用程序上一次恢复时)。

    解决这个问题的另一种方法是将 onActivityResult() 返回的信息存储在变量中,这些变量将由 onResume() 获取并在那里处理(在 onResume() 执行任何所需的初始化之后),而不是执行onActivityResult() 本身的主体内的处理。

    这是一个非常简洁的功能文档,没有提供任何解释或警告(在官方文档中)关于这种有点意外排序的后果。在测试过程中也很容易错过这个问题,因为在没有运行很多应用程序的内存充足的设备上,调用 startActivityForResult()(或其变体)的活动可能永远不会在等待时从内存中刷新启动活动通过 onActivityResult() 返回结果,因此 onResume() 完成的所有初始化都已经可用,因此可能无法检测到问题。

    对围绕此排序的一些问题进行了丰富的探索(包括有关尝试使用应用的 Application 对象来保护变量免受其影响的警告),并附有手绘的 UML 序列图,此处:

    http://steveliles.github.com/android_activity_lifecycle_gotcha.html

    【讨论】:

      【解决方案3】:

      首先调用onActivityResult()(刚刚用一些日志语句确认了这一点,并看到onActivityResult()确实在onResume()之前被调用)

      【讨论】:

      • 我的测试也证实了这一点。 onResume() 在 onActivityResult() 之后调用。
      猜你喜欢
      • 2011-05-14
      • 2017-06-03
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2018-11-15
      相关资源
      最近更新 更多