標籤:
上周三去了網易面試被問到了這個問題,當時沒有回答正確,回來以後特地寫了一個程式研究一下。
關於Android activity的啟動模式一共有四種 standard singleTop singleTask singleInstance 這四種
standard 和singleTop都比較好理解,這裡主要研究一下 singleTask singleInstance的區別
首先是:singleTask
假設有兩個Activity 分別是A 和 B ,Activity A的啟動模式是standard Activity B的啟動模式是singleTask, A中可以啟動B,同時B中也可以啟動A
通過A 啟動B ,可以發現 A B的taskId是相同的,說明A和B運行在同一個棧裡面,然後通過B啟動A 此時的A也是在這個棧裡,現在這個棧裡從棧底到棧頂的順序依次是 A—B—A,之後通過A再次啟動B這個時候B的lanchMode就起作用了。通過測試發現 棧裡不會產生新的B的執行個體,以前的時候起總以為棧裡是這樣的 A—A—B (ps:當時 面試的時候我就是這樣回答的)實際運行結果是 A—B 中間的A直接被銷毀了。
接著是:singleInstance
假設有兩個Activity 分別是A 和 B ,Activity A的啟動模式是standard Activity B的啟動模式是singleInstance, A中可以啟動B,同時B中也可以啟動A
通過A啟動B,可以發現A B的taskId是不相同的,說明A啟動B的時候產生了一個新的棧,B運行在一個新的棧裡面,時候通過B再次啟動A 現在兩個棧裡面的情況分別是 這樣的,原來的棧:A—A 新的棧:B
然後通過A再次啟動B可以發現在新的棧裡並沒有產生新的B的執行個體 新的棧依舊是:B 只不過B被顯示到了最前面;
總結:singleTask 和singleInstance的區別是:singleTask不會產生新的棧, singleInstance第一次調用的時候則會產生新的棧, singleTask模式下 如果原來的棧裡已經存在要調用的Activity的執行個體,下次調用的時候會銷毀中間所有的Activity。
Android singleTask 和singleInstance的區別