singleInstance和singleTask導致startActivityForResult回撥失敗
先來了解下這兩種啟動模式:
1.singleInstance,全域性唯一,它的例項在全域性(即在眾多工棧中)是唯一的,它單獨地存在於屬於自己的任務棧中,而且這個任務棧沒有其他例項。
2.singleTask,任務棧中唯一,它的例項在任務棧中是唯一的。它在被Intent的時候,會先在系統中查詢屬性值affinty與它的屬性值taskAffinity相同的任務棧是否存在,如果存在,則在這個任務啟動,如果不在,則在新任務棧中啟動。如果想要這種啟動模式的activity在新的任務棧中啟動,就要為它設定單獨的taskAffinity。請記住,如果設定了單獨的taskAffinity,那麼這種啟動模式的activity就會跟啟動它的activity不在同一個任務棧中。
為什麼singleInstance會導致回撥失敗呢?我們來模擬一下:
A是預設啟動模式,B是singleInstance,在A中startActivityForResult() B
檢視log日誌:
在A中startActivityForResult()後,A馬上失去焦點,接著立即回調了onActivityResult(),resultCode=0也就是結果碼是RESULT_CANCELED。因為立即回調了onActivityResult(),所以A重新獲得焦點onResume然後失去焦點,最後B起來。
同樣,A是singleInstance,B是預設啟動模式,或者A和B都是singleInstance,都是在A中startActivityForResult() B,得到的結果跟上述一樣。
為什麼目標的是singleTask會導致回撥失敗呢?
A是預設啟動模式,B是singleTask(沒有單獨的taskAffinity),在A中startActivityForResult() B
檢視log日誌:
得到的結果跟使用了singleInstance是一樣的。
如果A是預設啟動模式,B是singleTask(設定單獨的taskAffinity),得到的結果也是跟上述一樣。
根據結果,分析如下:
1.因為當使用了singleInstance,兩者就不在同一個任務棧中,所以startActivityForResult回撥失敗。
2.我覺得,因為當使用了singleTask以後,接intent的Activity就有可能跟發intent的不在同一個任務棧中(設定了單獨的taskAffinity),所以startActivityForResult回撥失敗。
結論是:如果發現兩者有可能不在同一個任務棧中,startActivityForResult回撥失敗。。。。那麼在使用startActivityForResult時,發Intent和接Intent的activity最好都是預設啟動模式,否則要保證發Intent的不是singleInstance以及接Intent的不是singleInstance或singleTask,這樣才能保證回撥成功。