zoukankan      html  css  js  c++  java
  • setResult()的调用时机

      今天遇到这样一个问题,我在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() 的调用时机。

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

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

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

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

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

    实际使用场景有两个:

    (1)按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,

           方法:重写onBackPressed()方法,捕获BACK事件,捕获到之后先setResult。代码:

    @Override
     public void onBackPressed()
     {
            Log.i(TAG, "onBackPressed");
            setResult(Const.LIVE_OK);
            super.onBackPressed();
     }

      

    (2)按点击事件中显式的调用finish()

    setResult(RESULT_OK);
    finish();

     

    执行过程为:

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

     

  • 相关阅读:
    DRF简易了解
    Restful API接口规范
    Python分页
    vue笔记(一)
    CNN实现手写数字识别
    深度学习框架Keras
    NLP自然语言处理
    深度学习框架Tensorflow
    维度的区分
    矩阵求导
  • 原文地址:https://www.cnblogs.com/shaweng/p/3875825.html
Copyright © 2011-2022 走看看