Android应用开发—setResult()的调用时机
本文轉(zhuǎn)載自setResult()的調(diào)用時(shí)機(jī),此處做了重新的排版,只是感覺markdown的排版比較好看些,侵刪。
今天遇到這樣一個(gè)問題,我在Activity-A中用startActivityForResult()方法啟動(dòng)了Activity-B,并且在B中通過setResult()方法給A返回值,由于某些原因不能在setResult()之后立刻調(diào)用finish()函數(shù),只能通過用戶按Back鍵自己退出到A。按理說從B退出回到Aactivity-A過程中,A中的 onActivityResult() 應(yīng)該被調(diào)用, 可是通過log發(fā)現(xiàn),整個(gè)操作過程中 onActivityResult() 始終沒有被調(diào)用。 前后研究了半天才發(fā)現(xiàn) 是 setResult() 的調(diào)用時(shí)機(jī)不對(duì)造成的,因?yàn)樵谖沂窃贐的onStop() 函數(shù)中調(diào)用setResult()函數(shù)的,這個(gè)時(shí)候的seResult是沒有任何意義的,因?yàn)橐呀?jīng)錯(cuò)過了A onActivityResult() 的調(diào)用時(shí)機(jī)。
因?yàn)樵?B 退回 A過程中,執(zhí)行過程是
B---onPause A---onActivityResult A---onRestart A---onStart A---onResume B---onStop B---onDestroy從上面過程可以看出,首先是B處于Pause 狀態(tài),然后等待A執(zhí)行 onRestart-> onStart ->onResume,然后才是B 的onStop->onDestroy,而A的 onActivityResult() 需要在B的onPause之后,A的onRestart之前這中間調(diào)用,所以B中的setResult()函數(shù)應(yīng)該放在B的onPause之前調(diào)用。
另外我試驗(yàn)了一下,如果把setResult()放在 B 的 onPause() 里面調(diào)用,結(jié)果仍然是無效的。
那么setResult()應(yīng)該在什么時(shí)候調(diào)用呢?從源碼可以看出,Activity返回result是在被finish的時(shí)候,也就是說調(diào)用setResult()方法必須在finish()之前。所以在onPause、onStop、onDestroy方法中調(diào)用setResult()也有可能不會(huì)返回成功,因?yàn)檫@些方法調(diào)用不一定是在finish之前的 (why,to find out the reason),當(dāng)然在onCreate()就調(diào)用setResult肯定是在finish之前的,但是又不滿足業(yè)務(wù)需要。
實(shí)際使用場(chǎng)景有兩個(gè):
- 按BACK鍵從一個(gè)Activity退出來的,一按BACK,android就會(huì)自動(dòng)調(diào)用Activity的finish()方法。
- 按點(diǎn)擊事件中顯式的調(diào)用finish()
執(zhí)行過程為:
B---onBackPressed B---finish B---onPause A---onActivityResult A---onRestart A---onStart A---onResume B---onStop B---onDestroy總結(jié)
以上是生活随笔為你收集整理的Android应用开发—setResult()的调用时机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【老杜】MySQL—day02
- 下一篇: Java 8 Stream的性能到底如何
