溫馨提示×

溫馨提示×

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

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

Android中有哪些啟動(dòng)模式

發(fā)布時(shí)間:2021-07-20 10:46:26 來源:億速云 閱讀:120 作者:Leah 欄目:移動(dòng)開發(fā)

Android中有哪些啟動(dòng)模式,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

不同程序的Android啟動(dòng)模式可以共享一個(gè)affinity;同一個(gè)程序的activity可以使用不同的afninity。afninity在符合以下2個(gè)條件的時(shí)候啟動(dòng):當(dāng)啟動(dòng)acitity的Intent中含有FLAG_ACTIVITY_NEW_TASK 節(jié)點(diǎn),或者一個(gè)activity的allowTaskReparenting 屬性設(shè)置為"true"。

之前提到,任務(wù)的默認(rèn)通過startActivity(). 激活的默認(rèn)activity也和其他activity在一個(gè)堆棧里面。但是引發(fā)這個(gè)activity的Intent通過startActivity() 方法傳遞了 FLAG_ACTIVITY_NEW_TASK 節(jié)點(diǎn)。望文知意,這個(gè)節(jié)點(diǎn)表示新的任務(wù)。但是,也不一定;如果任務(wù)中沒有含有此afinity的activity,那么它從默認(rèn)的activity開始。

allowTaskReparenting 節(jié)點(diǎn)如果activity的 allowTaskReparenting 屬性設(shè)置為 "true", 它就可以脫離開始它的任務(wù),然后通過它的afinity指引,走入下一個(gè)任務(wù)。例如,假設(shè)“旅游軟件”有一個(gè)activity可以獲取指定城市的天氣。

這個(gè)activity和此程序中的其他activity有同樣的afinity(默認(rèn)的afinity)。并且允許重新轉(zhuǎn)入另外的任務(wù)。某個(gè)activity開始了天氣預(yù)報(bào)動(dòng)作,它一開始屬于這個(gè)任務(wù);但是旅游程序到前臺(tái)運(yùn)行的時(shí)候,天氣預(yù)報(bào)acivity被分配到旅游程序運(yùn)行。

如果從用戶角度看,一個(gè).apk文件包含許多程序,你必須適當(dāng)?shù)姆峙洳煌腶ffinity給activitis,哪個(gè)任務(wù)將包含intent指定要運(yùn)行的activity:對(duì)于 "standard" 和 "singleTop" 模式,啟動(dòng)activity的intent 。

(即調(diào)用 startActivity()方法的) —除非intent對(duì)象包含F(xiàn)LAG_ACTIVITY_NEW_TASK 節(jié)點(diǎn),如果是的話,會(huì)像上個(gè)章節(jié)描述的一樣, Affinities and new tasks,另外一個(gè)任務(wù)會(huì)承載這個(gè)activity。

相對(duì)的, "singleTask" 和 "singleInstance" 模式使得activity永遠(yuǎn)在tast的根,他們初始化一個(gè)任務(wù),不會(huì)融入到其他任務(wù)中 。activity是否會(huì)有多個(gè)實(shí)例. "standard" 或 "singleTop"模式的activity可以被示例化多次,屬于多個(gè)任務(wù),或者一個(gè)任務(wù)中有多個(gè)此activity的實(shí)例。

相對(duì)的,, "singleTask" 和 "singleInstance" 模式的activities限制為只能有一個(gè)實(shí)例。因?yàn)檫@些activity在任務(wù)的根,這表示,任務(wù)也只有一個(gè)。同一個(gè)任務(wù)中是否可以有其他的activity: "singleInstance" 模式的activity所在的任務(wù)中不能有其他的activity ,如果啟動(dòng)其他activity。

那么其他activity 會(huì)被附加到新的任務(wù)(不管新activity的Android啟動(dòng)模式是什么) — 就像intent使用了 FLAG_ACTIVITY_NEW_TASK 標(biāo)記。在其他方面, "singleInstance" 和 "singleTask"沒有什么區(qū)別。

其他三種模式允許多個(gè)acitvity在同一個(gè)任務(wù)中。singleTask 的activity必須在任務(wù)的根,它可以啟動(dòng)其他設(shè)置到該任務(wù)的activity。而standard" 和 "singleTop"可以用于任務(wù)的任何位置。

一個(gè)類的新實(shí)例是否可以接受、處理其他部分發(fā)來的intent: 默認(rèn)的"standard" 模式可以響應(yīng)任何新的intent。每個(gè)實(shí)例處理一個(gè)intent。 "singleTop" 模式的activity如果在任務(wù)的頂部,則用已有的實(shí)例處理所有請(qǐng)求該實(shí)例的intent;反之創(chuàng)建一個(gè)新的實(shí)例,并壓入任務(wù)的頂部。

例如,一個(gè)任務(wù)包含根activityA,和其他activityB,C,D,D在任務(wù)堆棧的頂部,即堆棧為A-B-C-D. 一個(gè)intent請(qǐng)求D。如果D是"standard" Android啟動(dòng)模式,則D的一個(gè)新實(shí)例被創(chuàng)建,任務(wù)堆棧變?yōu)锳-B-C-D-D. 但是。

如果D的Android啟動(dòng)模式是"singleTop", 則現(xiàn)有的D的實(shí)例來響應(yīng)intent,所以任務(wù)堆棧仍然是A-B-C-D. 另外一種情況,如果intent來請(qǐng)求B,如果B是 "standard" 或者 "singleTop" 模式,B都將創(chuàng)建一個(gè)新的實(shí)例來響應(yīng),則任務(wù)堆棧為 A-B-C-D-B。

就像上面提到的,"singleTask" 或 "singleInstance" 的activity只有1個(gè)實(shí)例,所以這個(gè)實(shí)例要處理所有的intent。"singleInstance" 的activity永遠(yuǎn)在任務(wù)堆棧的頂部(因?yàn)樗侨蝿?wù)中的***個(gè)activity),所以這個(gè)實(shí)例處理所有的intent。可能有其他的activity在"singleTask" 的activity的頂部,因此這個(gè)實(shí)例不會(huì)處理intent請(qǐng)求,因此intent的請(qǐng)求會(huì)失?。唬词故?,intent也會(huì)激活這個(gè)程序)

注意:當(dāng)一個(gè)新的activity的實(shí)例為了響應(yīng)intent而創(chuàng)建時(shí),用戶可以按BACK鍵回到上一個(gè)狀態(tài)(上一個(gè)activity)。但是當(dāng)一個(gè)已經(jīng)存在的activity處理新的intent的時(shí)候,用戶不能按BACK鍵后退了。

關(guān)于Android中有哪些啟動(dòng)模式問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

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

AI