現象
今天在編寫代碼的時候,涉及到兩個Activity通過Intent來傳值的問題。具體描述為:activity A調用startActivityForResult()函數啟動Activity B,然后B結束時通過setResult()函數將一些值回傳給A。筆者過去使用這種方法很多次,屢試不爽。但是,今天居然出現了一個奇怪的現象,即從B跳回A后並沒有按照預想的邏輯執行,通過抓Log發現,當從A啟動B的時候,A中的onActivityResult()和onResume()函數均被執行。完全不符合邏輯。后來查資料,有人提到這可能與將要跳轉的Activity B的啟動模式相關。特別是當Activity使用singleTask模式啟動的時候,不能使用startActivityForResult()函數,否則就會出現立即執行onActivityResult()函數。
解決方法
將要跳轉的Activity B的啟動模式改為標准模式,問題得到解決。
分析
找到的一些資料:(摘抄自http://aijiawang-126-com.iteye.com/blog/1717326)從SDK我們可以看到如下深奧的解釋:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode The other modes — singleTask and singleInstance — are not appropriate for most applications, since they result in an interaction model that is likely to be unfamiliar to users and is very different from most other applications. 從柯元旦的《Android 內核剖析》的第十章“Ams內部原理“10.1.3中有這樣的一段話:請注意:SINGLE_TASK標識以及SINGLE_INSTANCE兩個標識必 須在r.result==0的條件中,即這兩個標識只能用在startActivity()的方法中,而不能使用在 startActivityForResult方法中。因為從Task的角度看,Android認為不同Task之間的Activity是不能傳遞數據 的,所以不能使用NEW_TASK標識,但還是要調用forResult方法。
當然這種說法很無賴。就像數學里面提到的公理一樣,既然是公認的規定,還是要達成共識。筆者當然是不甘心的。於是又找到了一篇文章,解釋的較為清楚。
如圖:假設當前的應用程序存在兩個棧:其中一個直接顯示在屏幕上負責與用戶完成交互,叫BackStack;另一個是隱藏在后台的background task,且位於該棧頂的Activity Y的啟動模式被設置為
singleTask。

由於這種現象的存在,所以android系統處於某種保護機制,發現將要跳轉的Activity的啟動模式是singleTask時,若需要執行onActivityResult()函數則立即執行。這樣就好理解多了