前言:網(wǎng)上說,使用startActivityForResult()進(jìn)行數(shù)值回傳時(shí),onActivityResult()執(zhí)行順序在不同啟動(dòng)模式下有所差別。本人就對(duì)此進(jìn)行了驗(yàn)證。
一.頁面跳轉(zhuǎn)使用的跳轉(zhuǎn)方法
眾所周知,Activity的跳轉(zhuǎn)可以分為兩類,分別是使用 startActivity()和startActivityForResult(),前者通常用于頁面間正常的跳轉(zhuǎn),后者一般用于頁面間傳值(通過Intent)。onActivityResult()是在使用了startActivityForResult()才會(huì)調(diào)用。
二.onActivityResult()方法的使用(這里用MainActivity跳轉(zhuǎn)到SecondActivity,demo是點(diǎn)擊按鈕btn跳轉(zhuǎn))



三.結(jié)果(以下說的launchMode是指SecondActivity清單文件的配置)
1.在android5.0及以上系統(tǒng),onActivityResult()都是在SecondActivity按返回鍵或調(diào)用finish()以后才執(zhí)行,下圖是相關(guān)生命周期執(zhí)行情況(四種launchMode都是這樣的順序);

2.但是,在5.0以下系統(tǒng),
當(dāng)launchMode設(shè)置為standard(默認(rèn)的)和singletop模式時(shí),同樣操作執(zhí)行的順序跟圖1相同。
當(dāng)launchMode設(shè)置為singletask和singleinstance模式時(shí),其執(zhí)行順序會(huì)跟圖1不同(如下圖2)。

四.總結(jié)
1.兩個(gè)頁面跳轉(zhuǎn)數(shù)值回傳時(shí)(即使用startActivityForResult())時(shí),除特殊情況下,5.0以下系統(tǒng)目標(biāo)Avcivity的啟動(dòng)模式(launchMode)影響onActivityResult()的執(zhí)行順序,源Avcivity無影響(本案例中SecondActivity是目標(biāo)Avcivity,MainActivity是源Avcivity)。
2.在android5.0及以上系統(tǒng)時(shí),onActivityResult()不受清單文件中啟動(dòng)模式影響,都是在SecondActivity按返回鍵或finish()以后執(zhí)行。(如圖1,有特殊情況,稍后補(bǔ)充)
3.在android5.0以下系統(tǒng)時(shí),如果啟動(dòng)模式是standard(默認(rèn)的)和singletop,onActivityResult()是在SecondActivity按返回鍵或finish()以后執(zhí)行(如圖1)。當(dāng)啟動(dòng)模式是singletask和singleinstance時(shí),onActivityResult()是在執(zhí)行startActivityForResult()時(shí)立即執(zhí)行(如圖2)。
4.特殊情況:在android5.0及以上系統(tǒng),當(dāng)設(shè)置MainActivity中跳轉(zhuǎn)使用的intent的flag為FLAG_ACTIVITY_NEW_TASK時(shí),生命周期執(zhí)行情況如圖2.

五.原因
原因參考:https://stackoverflow.com/questions/8960072/onactivityresult-with-launchmode-singletask