有人可以告诉我先调用哪个,是onActivityResult()
还是onResume()
?
例如:
活动A调用startActivityForResult()
来启动活动B. B执行,完成并将结果返回给A,但首先调用A的哪个方法,onActivityResult()
或onResume()
?
我知道有人已经通过引用Activity Docs回答了这个问题,但我自己找不到。
答案 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()
)