Android onActivityResult()&;onResume()

Android onActivityResult()&;onResume(),android,Android,有人能告诉我哪一个先被调用吗?它是onActivityResult()还是onResume()? 例如: 活动A调用startActivityForResult()来启动活动B。B执行、完成并将结果返回给A,但首先调用A的哪个方法,onActivityResult()或onResume() 我知道有人已经通过引用回答了这个问题,但是我自己在里面找不到。首先调用onActivityResult()然后调用onResume() 引用文件: 在ActivityResult(int)上受保护的无效 请求

有人能告诉我哪一个先被调用吗?它是
onActivityResult()
还是
onResume()
? 例如:

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


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

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

引用文件:

在ActivityResult(int)上受保护的无效 请求代码,int resultCode,Intent (数据)

自:当 你发起的活动退出,给予 您可以输入启动它的请求代码 使用返回的结果代码,以及 任何来自它的附加数据。这个 如果发生以下情况,结果代码将被取消 活动显式返回, 没有返回任何结果,或崩溃 在其运行期间您将收到 这个电话就在之前 当您的活动处于活动状态时,onResume() 重新启动。


首先调用
onActivityResult()
(只需用一些日志语句确认这一点,并查看在
onResume()
之前确实调用了
onActivityResult()

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

Diane Hackborn解释说,onActivityResult()在onResume()之前被调用,以便在更新UI之前能够接收和使用任何可能影响UI的内容(可能是为了避免双重更新—一次在onResume()中,不返回结果,然后在onActivityResult()中,添加返回结果)

这样做的一个结果是,当调用onActivityResult()时,您可能决定只在onResume()中执行的任何初始化(例如,来自外部源的数据的初始化,您需要刷新)而不是在onCreate()中执行的任何初始化都将被取消初始化在重新启动已被操作系统从内存中刷新的应用程序时发生(因为onResume()在onActivityResult()之前不会被调用)

在这种情况下,onActivityResult()必须准备好对onActivityResult()使用的任何此类变量执行此类初始化

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

处理此问题的另一种方法是将onActivityResult()返回的信息存储在变量中,这些变量将由onResume()提取并在那里进行处理(在onResume()执行任何必需的初始化之后),而不是在onActivityResult()本身的主体中执行处理

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

这里有一个关于该排序的一些问题的信息性探索(包括关于试图使用应用程序的应用程序对象保护变量不受其影响的警告),以及一个手绘的UML顺序图,如下所示:


目前,我的代码似乎在重新启动之前立即调用ActivityResult:-/这些图表可能有助于理解活动和片段的完整生命周期:我的测试也证实了这一点。onResume()在onActivityResult()之后调用。