Activity的LanchMode
在默認情況下赏表,我們多次啟動同一個Activity時,系統(tǒng)會創(chuàng)建多個實例并把他們放入到任務棧中蜡秽,每當按back鍵返回代赁,處于棧頂?shù)腁ctivity就會出棧,一直下去踊兜,知道棧為空竿滨。任務棧與數(shù)據(jù)結構棧模式一致,都是“后進先出”捏境。那么于游,對于同一次活動,如果我們多次啟動垫言,就多次創(chuàng)建相同的實例贰剥,這樣其實在某些情況下對資源的利用是一種浪費,因此筷频,安卓開發(fā)中就有了四種啟動模式:standard蚌成、singleTop、singleTask凛捏、singlnstance
(1)standard
系統(tǒng)的默認模式為標準模式担忧,這種模式下,每一次啟動activity都會重新創(chuàng)建一個實例葵袭,然后放入任務棧中(即使棧中已經存在了這個實例涵妥。那么這個acitivity的生命周期符合經典情況下的生命周期,如onCreate等坡锡。
- 需要注意的是蓬网,每個實例可以屬于不同的棧,誰啟動了Activity鹉勒,Activity就會進入到對應的棧帆锋。
- 因ApplicationContext沒有任務棧,所以無法采用標準模式啟動Activity禽额。但可通過為待啟動的Activity指定標記位:FLAG_ACTIVITY_NEW_TASK锯厢,那么在啟動時就會為其創(chuàng)建一個新的任務棧(這實際上是采用了singleTask啟動模式)
(2)singleTop
棧頂復用模,其實很好理解脯倒,就是如果啟動的Activity已經存在于當前任務棧的棧頂实辑,那么就可以復用棧頂?shù)倪@個實例,而不會重新創(chuàng)建一個新的實例藻丢,這樣子對于資源的利用率就提高了剪撬。
需要注意的是,在這種情況下悠反,onCreate残黑、onStart不會被系統(tǒng)調用,因為這個實例并沒有改變斋否。并且梨水,如果新啟動的活動沒有位于棧頂,仍然會被重新創(chuàng)建茵臭。
(3)singleTask
棧內復用模式疫诽。同樣很好理解,只要新啟動的Activity于任務棧中已經存在旦委,那么系統(tǒng)不會再重新創(chuàng)建該實例踊沸,而是把存在的棧調到棧頂并調用onNewIntent方法。
(4)singleInstance
單實例模式社证。它除了具有singleTask模式的所有特性之外逼龟,還要求Activity只能位于一個單獨地任務棧中。那么追葡,由于棧內復用的特性腺律,后續(xù)再次啟動都不會創(chuàng)建新的實例,除非這個棧被系統(tǒng)回收宜肉。
啟動模式的指定方法
上面簡單介紹了活動的啟動模式匀钧,其實并不難理解,接下來看一個啟動模式如何指定谬返。
1.通過AndroidMenifest指定
<activity
android:name="activity"
android:configChanges="screenLayout"
android:lanchMode="singleTask"
android:label="@string/app_name" />
2.通過設置Intent標志位
Intent intent=new Intent(MainActivity.this,secondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)之斯;
startActivity(intent);
標記位屬性及其含義
FLAG_ACTIVITY_SINGLE_TOP 指定啟動模式為棧頂復用模式(singleTop)
FLAG_ACTIVITY_NEW_TASK 指定啟動模式為標準模式(standard)
FLAG_ACTIVITY_CLEAR_TOP 所有位于其上層的Activity都要移除,一般和singleTask啟動模式一起使用
從優(yōu)先級來看遣铝,第二種方式要高于第一種佑刷,如果兩種方式同時存在莉擒,將會以第二種方式為準。但是瘫絮,需要注意涨冀,第二中方式無法為其指定單實例模式;Manifest設置方式無法設定FLAG_ACTIVITY_CLEAR_TOP標識麦萤。
總結
本文簡要介紹了Activity的幾種啟動模式鹿鳖,具體實現(xiàn)讀者可以按照設置方法設置后,結合AS去理解壮莹。