Android中有哪些啟動(dòng)模式,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
西充網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,西充網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為西充成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的西充做網(wǎng)站的公司定做!
不同程序的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:對于 "standard" 和 "singleTop" 模式,啟動(dòng)activity的intent 。
(即調(diào)用 startActivity()方法的) —除非intent對象包含F(xiàn)LAG_ACTIVITY_NEW_TASK 節(jié)點(diǎn),如果是的話,會(huì)像上個(gè)章節(jié)描述的一樣, Affinities and new tasks,另外一個(gè)任務(wù)會(huì)承載這個(gè)activity。
相對的, "singleTask" 和 "singleInstance" 模式使得activity永遠(yuǎn)在tast的根,他們初始化一個(gè)任務(wù),不會(huì)融入到其他任務(wù)中 。activity是否會(huì)有多個(gè)實(shí)例. "standard" 或 "singleTop"模式的activity可以被示例化多次,屬于多個(gè)任務(wù),或者一個(gè)任務(wù)中有多個(gè)此activity的實(shí)例。
相對的,, "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í)例處理所有請求該實(shí)例的intent;反之創(chuàng)建一個(gè)新的實(shí)例,并壓入任務(wù)的頂部。
例如,一個(gè)任務(wù)包含根activityA,和其他activityB,C,D,D在任務(wù)堆棧的頂部,即堆棧為A-B-C-D. 一個(gè)intent請求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來請求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??赡苡衅渌腶ctivity在"singleTask" 的activity的頂部,因此這個(gè)實(shí)例不會(huì)處理intent請求,因此intent的請求會(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)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。