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从以前的应用程序恢复)。