setResult()的呼叫時機
因為在 B 退回 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
另外我試驗了一下,如果把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