onActivityResult()&的onResume()

时间:2011-06-24 13:15:47

标签: android

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

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

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

3 个答案:

答案 0 :(得分:120)

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

来自docs的引用:

  

protected void onActivityResult(int   requestCode,int resultCode,Intent   数据)

     

自:API级别1调用时   你发起的活动退出,给予   你启动它的requestCode   with,返回的resultCode,和   来自它的任何其他数据。该   如果,resultCode将是RESULT_CANCELED   活动明确返回,   没有返回任何结果,或坠毁   在运作期间。 你会收到的   之前的这个电话   onResume()当你的活动是   重新起动。

答案 1 :(得分:41)

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

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()使用的任何此类变量执行此类初始化。

当然,如果onActivityResult()所需的初始化可以在onCreate()而不是onResume()中执行,那么onCreate()将在onActivityResult()和onResume()之前重启时调用,对于每次恢复应用程序时不需要执行的操作,这将是最简单的方法。但是,如果您正在初始化的数据来自外部源并且您需要它是新鲜的,则可能需要在onCreate()和onResume()中初始化此类数据,并使用onResume()检查onCreate中设置的标志()查看数据是否刚刚在onCreate中初始化),然后只有在尚未执行时才更新onResume()。这样,它的一些年份总是可用的(至少从上一次应用程序恢复时开始)。

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

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

有关此排序的一些问题的信息性探索(包括关于尝试使用应用程序的Application对象来保护变量免受其影响的警告),以及手绘的UML序列图,在此处:

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

答案 2 :(得分:11)

首先调用

onActivityResult()(刚刚通过一些日志语句确认了这一点,并且在onActivityResult()之前确实调用了onResume()