开发者社区> image_c> 正文

Android应用开发—setResult()的调用时机

简介: 本文转载自setResult()的调用时机,此处做了重新的排版,只是感觉markdown的排版比较好看些,侵删。 今天遇到这样一个问题,我在Activity-A中用startActivityForResult()方法启动了Activity-B,并且在B中通过setResult()方法给A返回值,由于某些原因不能在setResult()之后立刻调用finish()函数,只能通过用户按Back键自己退出到A。
+关注继续查看

本文转载自setResult()的调用时机,此处做了重新的排版,只是感觉markdown的排版比较好看些,侵删。

今天遇到这样一个问题,我在Activity-A中用startActivityForResult()方法启动了Activity-B,并且在B中通过setResult()方法给A返回值,由于某些原因不能在setResult()之后立刻调用finish()函数,只能通过用户按Back键自己退出到A。按理说从B退出回到Aactivity-A过程中,A中的 onActivityResult() 应该被调用, 可是通过log发现,整个操作过程中 onActivityResult() 始终没有被调用。 前后研究了半天才发现 是 setResult() 的调用时机不对造成的,因为在我是在B的onStop() 函数中调用setResult()函数的,这个时候的seResult是没有任何意义的,因为已经错过了A onActivityResult() 的调用时机。

因为在 B 退回 A过程中,执行过程是

B---onPause
A---onActivityResult
A---onRestart
A---onStart
A---onResume
B---onStop
B---onDestroy

从上面过程可以看出,首先是B处于Pause 状态,然后等待A执行 onRestart-> onStart ->onResume,然后才是B 的onStop->onDestroy,而A的 onActivityResult() 需要在B的onPause之后,A的onRestart之前这中间调用,所以B中的setResult()函数应该放在B的onPause之前调用。

另外我试验了一下,如果把setResult()放在 B 的 onPause() 里面调用,结果仍然是无效的。

那么setResult()应该在什么时候调用呢?从源码可以看出,Activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。所以在onPause、onStop、onDestroy方法中调用setResult()也有可能不会返回成功,因为这些方法调用不一定是在finish之前的 (why,to find out the reason),当然在onCreate()就调用setResult肯定是在finish之前的,但是又不满足业务需要。

实际使用场景有两个:

  • 按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法。
@Override
 public void onBackPressed()
 {
        Log.i(TAG, "onBackPressed");
        setResult(Const.LIVE_OK);
        super.onBackPressed();
 }
  • 按点击事件中显式的调用finish()
setResult(RESULT_OK);
finish();

执行过程为:

B---onBackPressed
B---finish
B---onPause
A---onActivityResult
A---onRestart
A---onStart
A---onResume
B---onStop
B---onDestroy

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
html通过js调用ios或android代码
html通过js调用ios或android代码
23 0
Android Studio中添加Flutter模板直接调用
Android Studio中添加Flutter模板直接调用
81 0
Android实现调用系统相机录像及实现录音
Android实现调用系统相机录像及实现录音
247 0
Android使用NDK(从java调用本地函数'JNI')
Android使用NDK(从java调用本地函数'JNI')
60 0
uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
629 0
JS(Javascript)调用Android原生方法三步走
JS(Javascript)调用Android原生方法三步走
69 0
html通过js调用ios或android代码
html通过js调用ios或android代码
44 0
Android 地图导航调用百度地图、高德地图、腾讯地图
Android 地图导航调用百度地图、高德地图、腾讯地图
564 0
Android开发之调用系统设置界面
Android开发之调用系统设置界面
92 0
【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )
【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )
127 0
+关注
image_c
Giter,Linux kernel,Android
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
蚂蚁聚宝Android秒级编译——Freeline
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像