近日捋了一下 startActivityForResult 的返回值調(diào)用問題,突然發(fā)現(xiàn)問題還挺多,所以在這里記錄一下現(xiàn)象,原因就不查了,感興趣的可以去查查原因。
測(cè)試情況
第一種情況:
發(fā)起頁面 :在Activity或者Fragment 調(diào)用 startActivityForResult
目標(biāo)頁面:?jiǎn)?dòng)模式為 singleTask
表現(xiàn)形式:
- 5.0以下系統(tǒng)
onActivitResult立即被回調(diào),且resultCode為RESULT_CANCEL
(參考 :http://blog.csdn.net/sodino/article/details/22101881) - 5.0及以上系統(tǒng)已經(jīng)修復(fù)這個(gè)問題,但具體表現(xiàn)需具體分析。
第二種情況:
發(fā)起頁面 :在Activity 調(diào)用 startActivityForResult
表現(xiàn)形式: onActivitResult 正常被回調(diào),且 requestCode 和 resultCode 均正常。
第三種情況:
發(fā)起頁面:在 v4.app.Fragment 調(diào)用 startActivityForResult
表現(xiàn)形式:
- 如果
v4.app.Fragment所在的Activity重寫了onActivitResult方法,且方法中有執(zhí)行super.onActivityResult(requestCode, resultCode, data);則
先調(diào)用v4.app.Fragment的onActivitResult,且requestCode和resultCode均正常。再調(diào)用Activity的onActivitResult方法,resultCode正常,requestCode為隨機(jī)數(shù)。 - 如果
v4.app.Fragment所在的Activity重寫了onActivitResult方法,但是方法沒有執(zhí)行super.onActivityResult(requestCode, resultCode, data);,則不調(diào)用v4.app.Fragment的
onActivitResult,只調(diào)用Activity的onActivitResult方法,resultCode正常,requestCode為隨機(jī)數(shù)。 - 如果
v4.app.Fragment所在的Activity未重寫onActivitResult方法,則調(diào)用v4.app.Fragment的onActivitResult,且requestCode和resultCode均正常。
第四種情況:
發(fā)起頁面:在 android.app.Fragment 調(diào)用 startActivityForResult
表現(xiàn)形式:只在 android.app.Fragment 回調(diào) onActivitResult,且 requestCode 和 resultCode 均正常。與其所在的 Activity 是否重寫 onActivitResult 無關(guān)。
總結(jié)
1,如果想在 Fragment 中回調(diào) onActivitResult ,則需要調(diào)用 Fragment 的 startActivityForResult。
2,不要?jiǎng)h除 Activity 中 onActivitResult 的 super 方法。
3,在 onActivitResult 處理結(jié)果時(shí),盡量根據(jù) requestCode 和 resultCode 共同判斷,防止意外情況出現(xiàn)。