溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Activity的啟動模式有哪些

發(fā)布時間:2020-12-11 14:33:57 來源:億速云 閱讀:182 作者:Leah 欄目:開發(fā)技術

今天就跟大家聊聊有關Activity的啟動模式有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。

解析Activity的四種啟動模式

standard

這種是標準啟動模式,默認就是這種啟動模式。每次啟動這種啟動模式的活動的時候都會創(chuàng)建一個新的實例放入棧中,不管棧中是否已經存在相同的實例。這也是最容易理解的。

singleTop

顧名思義,棧頂是單一實例的。什么意思呢。假設你現(xiàn)在啟動一個ActivityA,但是這個時候已經存在一個ActivityA實例在棧頂,那么這個時候,就不會創(chuàng)建新的實例。但是如果,在非棧頂存在相同的實例,還是會創(chuàng)建新的實例的。例如,現(xiàn)在棧中的活動是 ABC,A處于棧頂。然后此時啟動A,是不會再創(chuàng)建一個A活動出來,而是執(zhí)行A的onNewIntent方法;但是如果此時啟動C活動,由于棧頂是A不是C,那么還是會創(chuàng)建一個新的C實例出來,此時的棧情況就是CABC。

singleTask

單一任務模式。這個模式的意思是,在該活動的啟動棧中,只能存在單一實例,不管是否位于棧頂。與其他啟動模式不同的是,這個啟動模式可以指定棧去啟動。例如現(xiàn)在有一個棧Main,但是你可以給活動A指定一個棧名dev,那么啟動A的時候就會創(chuàng)建一個棧叫做dev。所以singleTask的意思就是,當你啟動一個啟動模式為singleTask的活動的時候,如果棧中沒有相同的實例,那么就會創(chuàng)建一個新的實例放入棧中;如果指定棧中存在相同的實例,例如棧中有ABC,然后你啟動B,那么這個時候不會去創(chuàng)建新的B實例,而是把B放到棧頂,并把A頂出去,再執(zhí)行B的onNewIntent方法,此時棧的情況就是BC。
細心的讀者會發(fā)現(xiàn)“頂出去”。是的,我們都知道棧是后進先出的特點,例如你往筒里放了3個羽毛球,那你想要拿到中間那個羽毛球,是不是只能先把上面那個抽出來呢,同樣的道理,要想把B提到棧頂,那么必須把A頂出來??赡軙泻芏嘧x者誤以為啟動后是BAC,但其實是BC,因為A得先出棧,B才能出來。同理,如果棧中是ADFBC,這個啟動B,也是BC,上面的全部被出棧了。

singleInstance

單例模式。這個是singleTask的強化版本。他會自己新建一個棧并把這個新的實例放進去,而且這個棧只能放這個活動實例。所以當重復啟動這個活動的時候,只要他存在,都是調用這個活動onNewIntent方法并切換到這個棧中,并不會去創(chuàng)建新的實例。

設置啟動模式的兩種方法

了解了活動的四種啟動模式,接下來看看如何給他指定啟動模式。

靜態(tài)設置

靜態(tài)設置就是在AndroidManifest中給具體活動設置啟動模式。通過給活動指定launchMode參數(shù)來設置啟動模式。例如:

 <activity android:name=".MainActivity"
      android:launchMode="singleInstance"/>

動態(tài)設置

動態(tài)設置是在啟動活動的時候再指定啟動模式,例如:

Intent intent = new Intent();
intent.setClass(this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

可以看到我們通過intent.addFlags這個方法來指定啟動模式,這個方法傳入一個參數(shù)來指定啟動模式,其他的參數(shù)有:

  • FLAG_ACTIVITY_NEW_TASK:singleTask模式

  • FLAG_ACTIVITY_SINGLE_TOP:singleTop模式

  • FLAG_ACTIVITY_CLEAR_TOP:清除該活動上方的所有活動。一般和singleTask一起使用。但是如果你的啟動模式是standard,那么這個活動連他之上的所有活動都會被出棧再創(chuàng)建一個新的實例放進去。例如現(xiàn)在棧中是ABCD,以FLAG_ACTIVITY_CLEAR_TOP+standard模式啟動C的時候,首先清理掉ABC,是的,C也會被清理,然后再創(chuàng)建一個新的C放進去,執(zhí)行之后就是CD。

特別注意的坑

singleInstance返回任務棧

現(xiàn)在模擬一個場景:現(xiàn)在有三個活動 A,B,C。A和C的啟動模式都是standard,B的啟動模式是singleInstance。先啟動A,再啟動B,然后再啟動C。這個時候問題來了,如果我這個時候按下返回鍵,是回到B嗎?答案是回到A。再按一下呢,返回桌面嗎?答案是回到B,再按一下再回到桌面。其實不難理解。我們都知道singleInstance會創(chuàng)建一個獨立的棧,當我們啟動A的時候,A位于棧First中,啟動B的時候,就會創(chuàng)建一個棧Second并把B實例放進去。這個時候再啟動C,就會切換到棧FIrst,因為singleInstance創(chuàng)建的棧只能放一個,所以C會放到棧First中,當按下返回的時候,棧First中的活動就會依次出棧,直到全部出完,才會切換到棧Second中。所以要注意這個點。

singleTask多任務棧啟動問題

這個問題和上面singleTop的本質是一樣的。模擬一個場景:現(xiàn)在有兩個棧:First:ABC;Second:QWE。棧First位于前臺,棧Second位于后臺。A位于棧頂。這個時候以singleTask的模式啟動W,會發(fā)生什么樣的情況呢?首先會切換到棧Second,再把Q出棧,W提到棧頂,并執(zhí)行W的onNewIntent方法。這個時候按返回鍵就會把Second棧中的活動依次出棧,全部出完后才會切換到棧First。

singleTask的TaskAffinity與allowTaskReparenting參數(shù)

前面我們講到給singleTask模式指定要啟動的任務棧的名字,怎么指定呢?可以在AndroidManifest中指定相關的屬性,如下:

<activity android:name=".Main2Activity"
     android:launchMode="singleTask"
     android:taskAffinity="com.huan"
     android:allowTaskReparenting="true"/>

這里解釋一下這兩個參數(shù)

  • taskAffinity:指定任務棧的名字。默認的任務棧是包名,所以不能以包名來命名。

  • allowTaskReparenting:這個參數(shù)表示可不可以切換到新的任務棧,通常設置為true并和上面的參數(shù)一起使用。

我前面講到可以給singleTask的活動指定一個棧名,然后啟動的時候,就會切換到那個棧,并把新的活動放進去。但是如果設置allowTaskReparenting參數(shù)為false的話是不會切換到新的棧的。這個參數(shù)的意思是可不可以把新的活動轉移到新的任務棧。簡單點來說:當我們啟動一個singleTask活動的時候,這個活動還是留在啟動他的活動的棧中的。但是我們指定了taskAffinity這個參數(shù),或者啟動的活動是別的應用中的活動,那么就會創(chuàng)建一個新的任務棧。如果allowTaskReparenting這個參數(shù)是true的話,那么這個活動就會放到那個新的任務棧中。這樣應該就可以明白了。所以這兩個經常是配套一起使用的。

看完上述內容,你們對Activity的啟動模式有哪些有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI