日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2023/12/19 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用开发—setResult()的调用时机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉載自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()方法。
@Overridepublic 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

總結

以上是生活随笔為你收集整理的Android应用开发—setResult()的调用时机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。