安卓工程師必備:205款安卓常用精品控件!先收藏着吧!http://lesscode.cn/index.php?s=/category-index-id-1.shtml
在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。那各個頁面跳轉關系如何決定呢?如果啟動了順序啟動了ABCD的Activiy,如何從D調回到B呢?下面講述一下Acitivity的四種啟動模式。講解啟動模式之前,有必要先講解一下“任務棧”的概念;
任務棧
每個應用都有至少一個任務棧,是用來存放Activity的,功能類似於函數調用的棧,先后順序代表了Activity的出現順序;比如Activity1-->Activity2-->Activity3,則任務棧為:
啟動模式:啟動模式簡單地說就是Activity啟動時的策略,在AndroidManifest.xml中的標簽的android:launchMode屬性設置;
四種啟動模式:
(1)standard:每次激活Activity時(startActivity),都創建Activity實例,並放入任務棧;這個是系統默認的啟動模式;
(2)singleTop:如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。
在每次使用新的Activity時會自動檢測棧頂的當前Activity是否是需要引用的Activity,如果是則直接引用此Activity,而不會創建新的Activity;當它不需要創建新的Activity對象時,它會調用onNewIntent()方法。
;
(3)singleTask:如果要激活的那個Activity在任務棧中存在該實例,則不需要創建,只需要把此Activity放入棧頂,並把該Activity以上的Activity實例都pop(彈出銷毀);這個模式可以用來退出整個應用。將主Activity設為SingTask模式,然后在要退出的Activity中轉到主Activity,然后重寫主Activity的onNewIntent函數,並在函數中加上一句finish。(因為Activity不創建,所以不會進入onCreate函數,只會進入onNewIntent函數)。
(4)singleInstance:如果應用1的任務棧中創建了MainActivity實例,如果應用2也要激活MainActivity,則不需要創建,兩應用共享該Activity實例;
此啟動模式和我們使用的瀏覽器工作原理類似,我們都知道在多個程序中訪問瀏覽器時,如果當前瀏覽器沒有打開,則打開瀏覽器,否則會在當前打開的瀏覽器中訪問。此模式會節省大量的系統資源,因為他能保證要請求的Activity對象在當前的棧中只存在一個。
以上就是Activity的四種啟動模式,那標題的Intent Flags又是什么鬼?
Flags: 表示Intent的標志位,常用於Activity的場景中,它和Activity的啟動模式有着密切的聯系。
下面列舉的是和本文主題相關的Flags屬性:
Intent.FLAG_ACTIVITY_NEW_TASK (默認)
默認的跳轉類型,它會重新創建一個新的Activity
FLAG_ACTIVITY_SINGLE_TOP
這個FLAG就相當於啟動模式中的singletop,例如:原來棧中結構是A B C D,在D中啟動D,棧中的情況還是A,B,C,D。singleTask不一樣的
FLAG_ACTIVITY_CLEAR_TOP
這個FLAG有點像啟動模式中的SingleTask,這種FLAG啟動的Activity會把要啟動的Activity之上的Activity全部彈出棧空間。例如:原來棧中的結構是A B C D ,從D中跳轉到B,棧中的結構就變為了A B了。但是和SingleTask不一樣的是,FLAG_ACTIVITY_CLEAR_TOP會把他上面的彈出,但是自身也銷毀,然后重新創建個新對象。而SingleTask不會重新創建新對象,就是不會觸發onCreate,只會觸發onNewIntent。
FLAG_ACTIVITY_NO_USER_ACTION
onUserLeaveHint()作為activity周期的一部分,它在activity因為用戶要跳轉到別的activity而要退到background時使用。比如,在用戶按下Home鍵,它將被調用。比如有電話進來(不屬於用戶的選擇),它就不會被調用。
那么系統如何區分讓當前activity退到background時使用是用戶的選擇?
它是根據促使當前activity退到background的那個新啟動的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION來確定的。
注意:調用finish()使該activity銷毀時不會調用該函數
FLAG_ACTIVITY_NO_HISTORY
意思就是說用這個FLAG啟動的Activity,一旦退出,它不會存在於棧中,比方說!原來是A,B,C這個時候再C中以這個FLAG啟動D的,D再啟動E,這個時候棧中情況為A,B,C,E。
注意:當調用到onNewIntent(intent)的時候,需要在onNewIntent() 中使用setIntent(intent)賦值給Activity的Intent.否則,后續的getIntent()都是得到老的Intent。
如果你對該內容感興趣,可加入187253654討論,關注【代碼零件】網站或微信公眾號