Android中的Activity共有四種加載方式,能夠在AndroidManifest.xml中對應的activity的android:launchMode中指定,四種方式以下:android
其中,standard是默認的加載方式,singleTop是棧頂單例模式,singleTask是Task內單例模式,singleInstance是全局單例模式,下面一一進行說明.測試
standard是默認模式,每次經過這種模式啓動時,都會爲Activity建立一個新的實例,並將這個新的實例添加到棧頂,每次按返回鍵就會一直出棧,處於棧頂的實例就算用戶看到的界面.
下面測試一下,新建一個Activity與一個Intent,加上一個Button與startActivity:
加上調試信息以及設置好logcat過濾後,測試:
能夠看到每次點擊按鈕都是一個新的實例,置於Task棧頂,示意圖以下:
而後,每次返回,棧頂的Activity出棧,直到棧爲空.spa
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的實例並放置於棧頂,此時棧示意圖以下:
而後點擊返回依次退棧.3d
singleTask表示同一個Task內只有一個實例,當準備實例一個Activitty時,會查看棧中有沒有這個Activity的實例對象,若是不存在,就建立一個實例,並放置於棧頂,若是已存在,則會移除此實例上面的全部實例移出棧,使目標實例位於棧頂.
下面來測試一下,修改FirstActivity的launchMode爲singleTask,SecondActivity不變:
首先進入First Activity,而後開啓了四個Second Activity,此時的棧以下:
而後點擊First的按鈕後,上面的四個Second Activity所有出棧:
所以上面的圖會看到連續有四個destroy.調試
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.xml
一個表總結:對象
操做順序 | standard | singleTop | singleTask | singleInstance |
---|---|---|---|---|
初始狀態 | ![]() |
![]() |
![]() |
![]() |
First->First | ![]() |
![]() |
![]() |
![]() |
First->Second | ![]() |
![]() |
![]() |
![]() |
Second->First | ![]() |
![]() |
![]() |
![]() |
First->Second | ![]() |
![]() |
![]() |
![]() |