以前對於四種模式的理解僅限於理論和一兩個簡單的測試(singleTop和singleTask)測試
今天腦殼抽風想都實際測一下,暈,測到 singleInstance杯具了it
請對四種模式熟悉的朋友直接跳到文章底部,幫忙看下singleInstance的問題,謝謝循環
未標明launchMode的Activity都是默認啓動模式程序
1,standard方法
每次都會新建一個Activity實例數據
2,singleTaskvi
棧空間簡易示意:A -- B -- C實例
最後用startActivity(intent)從C跳到A後,因爲棧空間已經存在A的實例,A上面的Activity B和C出棧(即onDestroy銷燬),A置於棧頂控件
若是A中重寫了onNewIntent(...)方法,會同時接到C跳A的intent數據系統
3,singTop
棧空間簡易示意:A -- B -- C
最後用startActivity(intent)從C跳到A後,即便棧控件已經存在A的實例,Android系統也會從新建立一個A的實例而且置於棧頂,固然重寫的onNewIntent(...)方法也不會接到intent數據, 變成:
4,singleInstance(代碼跳轉邏輯:A -- B -- C -- A -- B -- C .....)
1,起始Activity非singleInstance (實際跳轉順序:A -- B -- C -- A -- B -- C .....)
A,C位於同一棧中,taskId相同, B在另外一個棧中,與他們taskId不一樣,此棧在B未被銷燬前只能有B一個Activity(B在建立以後,onNewIntent(...)也能夠接到其餘Activity跳轉的intent數據),整個過程當中,B只建立了一次,A與C每次都建立一個實例
2,起始Activity爲singleInstance(實際跳轉順序:A -- B -- C -- A -- C -- A -- C .....)
代碼中第一種狀況相同,但實際跳轉順序卻不一樣,
第一次A -- B -- C 實際跳轉完成以後,當從C回到A(A在建立以後,onNewIntent(...)也能夠接到其餘Activity跳轉的intent數據)後,再從A跳B時,卻跳到了C頁面,依次循環,整個過程當中,B只是在一開始建立時出現了一次,以後從A都是直接跳C,A固然是單實例的,可是C也只建立了一次,至關因而單實例
屢次跳轉按物理返回鍵時:
若是當前頁面是A,則A銷燬,出現C,接着C銷燬,出現B,B銷燬,應用程序結束
若是當前頁面是C,則C銷燬,出現B,接着B銷燬,出現A,A銷燬,應用程序結束
返回鍵的實際跳轉狀況屬於正常,由於A的taskId, 與B,C不一樣,不在同一棧中
但singleInstance的第2中狀況,第一次A--B--C--A跳完以後,爲啥從A卻進入了C而且是以前的實例C,並非想象中的新建立一個Activity B的實例 ?
求指教哈,謝謝...