onActivityResult()&onResume()

有人可以告诉我哪个被调用,是onActivityResult()还是onResume() ? 例:

活动A调用startActivityForResult()来启动活动B.B执行完成并返回结果给A,但首先调用A的哪个方法, onActivityResult()onResume()

我知道有人已经通过参考活动文档回答了这个问题,但我自己找不到。

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

从文档引用:

protected void onActivityResult(int requestCode,int resultCode,Intent data)

从以下版本开始:API级别1当您启动的活动退出时调用,为您提供您启动的requestCode,返回的resultCode以及所有其他数据。 如果活动显式返回该结果,没有返回任何结果,或者在操作期间崩溃,resultCode将为RESULT_CANCELED。 当您的活动重新开始时,您将在onResume()之前立即收到此电话。

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

Diane Hackborn解释说,onActivityResult()在onResume()之前被调用,以便允许在更新UI之前接收和使用可能影响UI的任何东西(大概是为了避免双重更新 – 在onResume()中没有返回结果,然后在onActivityResult()中添加返回结果)。

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

这样做的一个后果就是你可能决定只在onResume()中执行的任何初始化(例如初始化来自你需要新鲜的外部数据源的数据),而不是onCreate(),当调用onActivityResult()是作为重新启动由OS刷新内存的应用程序的一部分而发生的(因为在onActivityResult()之前不会调用onResume())。

在这种情况下,onActivityResult()必须准备对onActivityResult()所使用的任何variables执行初始化。

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

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

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

关于这种sorting的一些问题(包括尝试使用应用程序的Application对象来保护variables不受其影响)的一些问题进行了深入的探讨,并附有一个手绘的UML序列图,在这里:

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

首先调用onActivityResult() (只是用几个日志语句证实了这一点,并且看到onActivityResult()确实在onResume()之前被调用)

这样做的一个后果就是你可能决定只在onResume()中执行的任何初始化(例如初始化来自你需要新鲜的外部数据源的数据),而不是onCreate() ,当调用onActivityResult()是作为重新启动由OS刷新内存的应用程序的一部分而发生的(因为在onActivityResult()之前不会调用onResume() onActivityResult() )。

在这种情况下,onActivityResult()必须准备对onActivityResult()所使用的任何variables执行初始化。

当然,如果onActivityResult()所需的初始化可以在onCreate()而不是onResume() ,那么因为onCreate()将在onActivityResult()onResume()之前重新启动,所以这将是最简单的方法去做你不需要做的每一次应用程序恢复。 但是,如果您正在初始化的数据来自外部源,并且您需要它是新鲜的,则可能需要在onCreate()onResume()初始化此类数据, onResume()检查onCreate()设置的标志onCreate()来查看数据是否刚刚在onCreate()初始化,然后在onResume()更新它,只有当它们没有。 这样,它的一些年份将始终可用(至less从以前的应用程序恢复)。