正如其他人所发布的,当您的活动重新启动时,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