1. 程式人生 > >singleInstance和singleTask導致startActivityForResult回撥失敗

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,這樣才能保證回撥成功。