setResult()的調用時機

來源:互聯網
上載者:User

標籤:android   des   style   blog   java   color   使用   strong   

  今天遇到這樣一個問題,我在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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.