1 概述
Android中的Activity共有四種加載方式,可以在AndroidManifest.xml中對應的activity的android:launchMode中指定,四種方式如下:
- standrad
- singleTop
- singleTask
- singleInstance
其中,standard是默認的加載方式,singleTop是棧頂單例模式,singleTask是Task內單例模式,singleInstance是全局單例模式,下面一一進行說明.
2 standard
standard是默認模式,每次通過這種模式啓動時,都會爲Activity創建一個新的實例,並將這個新的實例添加到棧頂,每次按返回鍵就會一直出棧,處於棧頂的實例就算用戶看到的界面.
下面測試一下,新建一個Activity與一個Intent,加上一個Button與startActivity:
加上調試信息以及設置好logcat過濾後,測試:
可以看到每次點擊按鈕都是一個新的實例,置於Task棧頂,示意圖如下:
然後,每次返回,棧頂的Activity出棧,直到棧爲空.
3 singleTop
singleTop允許一個Activity實例化多個對象,與standard唯一的不同就算,當將要啓動的Activity位於棧頂時,不會創建新的實例,而是直接複用已有實例.
另外,如果要啓動的Activity沒有位於棧頂,系統會創建新的實例,並加載到棧頂.
下面使用兩個Activity測試一下,增加一個按鈕和事件綁定,同時修改AndroidManifest.xml的android:launchMode爲singleTop:
這裏FirstActivity用的是singleTop,SecondActivity是standard.
一開始點擊First Activity沒反應,因爲此時First Activity位於棧頂,然後點擊了兩次Second,創建了兩個Second Activity實例,然後再次點擊First,此時FirstActivity沒有位於棧頂,因此新建First Activity的實例並放置於棧頂,此時棧示意圖如下:
然後點擊返回依次退棧.
4 singleTask
singleTask表示同一個Task內只有一個實例,當準備實例一個Activitty時,會查看棧中有沒有這個Activity的實例對象,如果不存在,就創建一個實例,並放置於棧頂,如果已存在,則會移除此實例上面的所有實例移出棧,使目標實例位於棧頂.
下面來測試一下,修改FirstActivity的launchMode爲singleTask,SecondActivity不變:
首先進入First Activity,然後開啓了四個Second Activity,此時的棧如下:
然後點擊First的按鈕後,上面的四個Second Activity全部出棧:
因此上面的圖會看到連續有四個destroy.
5 singleInstance
singleInstance是會使用一個全新的Task棧來存放該Activity實例,也就是說,Activity獨佔一個Task棧.下面把First Activity改成singleInstance,Second Activity不變:
一開始在Task id爲587的Task棧創建First Activity的一個實例,然後在Task id爲588的Task棧創建了三個Second Activity實例,示意圖如下:
退棧時,首先在當前Activity所在的Task棧進行退棧操作,而不是按照進棧的順序進行退棧,即先把當前Task出棧完成,再出棧其他Task.因此會先出棧First Activity,然後再出棧三個Second Activity.
6 總結
一個表總結:
操作順序 | standard | singleTop | singleTask | singleInstance |
---|---|---|---|---|
初始狀態 | ||||
First->First | ||||
First->Second | ||||
Second->First | ||||
First->Second |