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()方法。
@Override
public 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基礎及應用 Intent的呼叫AndroidIntent
- Android Jetpack - Android TV 應用開發教程AndroidJetpack
- Android應用開發進階Android
- 開發Android系統應用Android
- 運用Kotlin開發Android應用的一些技巧KotlinAndroid
- 快速上手系列--Android應用開發模板Android
- Android應用開發中如何使用隱藏的APIAndroidAPI
- Android開發之跟蹤應用更新大小Android
- Android之五大應用開發框架Android框架
- 用WindowsAppSDK(WASDK)優雅的開發上位機應用WindowsAPP
- Android Studio NDK開發-JNI呼叫Java方法AndroidJava
- Android開發在Activity外申請許可權呼叫相機開啟相簿Android
- 【Android開發入門教程】二.Android應用程式結構分析Android
- 鴻蒙 Android iOS 應用開發對比02鴻蒙AndroidiOS
- Android開發者峰會:Android應用效能優化經驗分享Android優化
- android驅動學習入門-android應用怎麼呼叫驅動2Android
- 是時候開始構建適用於 Android Automotive OS 的應用了!Android
- Android 開發者 | 應用相容性注意事項Android
- 音影片,時代的風口浪尖!Android 開發者的新機遇!Android
- 【Abyss】Android 平臺應用級系統呼叫攔截框架Android框架
- RabbitMQ的開發應用MQ
- 開發Android應用程式,在Android10的系統上提示網路出錯?Android
- Android開發應該掌握的Proguard技巧Android
- Android 開發應該掌握的 Proguard 技巧Android
- android短視訊開發,呼叫相機、相簿,壓縮圖片後上傳Android
- Android JNI開發系列之Java與C相互呼叫AndroidJava
- 應對微服務呼叫時的雪崩效應微服務
- Android示例應用:開源框架Glide的使用Android框架IDE
- 用Android Stuidio開發FlutterAndroidUIFlutter
- android開發透過wireshark實現flutter應用抓包AndroidFlutter
- 倒數計時應用定製化開發
- uni-app&H5&Android混合開發二 || 使用Android Studio打包應用APKAPPH5AndroidAPK
- android6.0新特性總結之開發應用時加以考慮的一些主要變更。Android
- C# 開發的環境監測上位機應用C#
- 如何使用點選超連結的方式開啟Android手機上的應用Android
- Android應用架構的發展和實踐Android應用架構
- elasticsearch的開發應用(3)Elasticsearch
- Ubuntu 18.04下Intel SGX應用程式程式開發——獲得OCALL呼叫的返回值UbuntuIntel
- android--相機開發----我的相機我做主Android