首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onActivityResult() & onResume()

onActivityResult() & onResume()
EN

Stack Overflow用户
提问于 2011-06-24 21:15:47
回答 3查看 42K关注 0票数 102

谁能告诉我谁先被调用,是onActivityResult()还是onResume()?示例:

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

我知道有人已经通过参考Activity Docs回答了这个问题,但我在那里找不到。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-24 21:24:01

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

引用自文档:

保护的无效数据(int requestCode,int resultCode,Intent data)

from :当您启动的活动退出时,将调用API Level 1,为您提供启动该活动的requestCode、它返回的resultCode以及其中的任何其他数据。如果活动显式返回,没有返回任何结果,或者在操作过程中崩溃,则resultCode将为RESULT_CANCELED。当您的活动重新启动时,您将在onResume()之前收到此调用。

票数 131
EN

Stack Overflow用户

发布于 2013-03-05 09:25:25

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

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

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

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

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

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

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

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

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

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

票数 44
EN

Stack Overflow用户

发布于 2011-06-24 22:03:14

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6468319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档