ctivity啟動(dòng)模式_第1頁
ctivity啟動(dòng)模式_第2頁
ctivity啟動(dòng)模式_第3頁
ctivity啟動(dòng)模式_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Activity啟動(dòng)模式講解:姜成波日期:2011-4-21最近一直在看任務(wù)還有Activity啟動(dòng)模式這塊,一直對(duì)這塊存在疑惑,為什么要有不同的啟動(dòng)模式?使用這些會(huì)為我們的開發(fā)帶來什么好處?今天周討論,和同事們針對(duì)此問題,大家相互探討了一下。在多Activity開發(fā)中,有可能是自己應(yīng)用之間的Activity跳轉(zhuǎn),或者夾帶其他應(yīng)用的可復(fù)用Activity。也可能會(huì)希望跳轉(zhuǎn)到原來某個(gè)Activity實(shí)例,而不是產(chǎn)生大量重復(fù)的Activity。為了有效的利用有限的內(nèi)存資源,這需要為Activity配置特定的加載模式,而不是使用默認(rèn)的加載模式。加載模式分類及在哪里配置Activity有四種加載模式: standard singleTop singleTask singleInstance設(shè)置的位置在AndroidManifest.xml文件中activity元素的android:launchMode屬性:也可以在Eclipse ADT中圖形界面中編輯:針對(duì)四種啟動(dòng)模式,我做了一個(gè)小例子LaunchMode_Test,大家可以通過按照下面的操作修改例子啟動(dòng)模式,來加深理解。三個(gè)Activity界面如下Fx_Main: Activity2:Activity3:standard首先說standard模式,也就是默認(rèn)模式,不需要配置launchMode。運(yùn)行例子從Fx_Main-Activity2-Activity2-Activity2可見,一直點(diǎn)回到Activity2按鈕時(shí),Log信息如下:發(fā)現(xiàn)每次都創(chuàng)建了Activity2的新實(shí)例。standard的加載模式就是這樣的,intent將發(fā)送給新的Activity實(shí)例?,F(xiàn)在點(diǎn)Android設(shè)備的回退鍵,可以看到是按照剛才創(chuàng)建Activity實(shí)例的倒序依次出現(xiàn),類似退棧的操作,而剛才操作跳轉(zhuǎn)按鈕的過程是壓棧的操作。singleTopsingleTop和standard模式,都會(huì)將intent發(fā)送新的實(shí)例(后兩種模式不發(fā)送到新的實(shí)例,如果已經(jīng)有了的話)。不 過,singleTop要求如果創(chuàng)建intent的時(shí)候棧頂已經(jīng)有要?jiǎng)?chuàng)建的Activity的實(shí)例,則將intent發(fā)送給該實(shí)例,而不發(fā)送給新的實(shí)例。還是用剛才的示例,只需將Activity2的launchMode改為singleTop,就能看到區(qū)別。運(yùn)行的時(shí)候會(huì)發(fā)現(xiàn),按多少遍按鈕,都是相同的Activity2實(shí)例,因?yàn)樵搶?shí)例在棧頂,因此不會(huì)創(chuàng)建新的實(shí)例。如果回退,回到Fx_Main,然后將退出應(yīng)用。singleTop模式,可用來解決棧頂多個(gè)重復(fù)相同的Activity的問題。如果是Fx_Main跳轉(zhuǎn)到Activity2,再跳轉(zhuǎn)到Fx_Main,行為就和standard一樣了,會(huì)在Activity2跳轉(zhuǎn)到Fx_Main的時(shí)候創(chuàng)建Fx_Main的新實(shí)例,因?yàn)楫?dāng)時(shí)的棧頂不是Activity2實(shí)例。singleTasksingleTask模式和后面的singleInstance模式都是只創(chuàng)建一個(gè)實(shí)例的。當(dāng)intent到來,需要?jiǎng)?chuàng)建singleTask模式Activity的時(shí)候,系統(tǒng)會(huì)檢查棧里面是否已經(jīng)有該Activity的實(shí)例。如果有直接將intent發(fā)送給它。(注意此時(shí)原在此Activity棧中上面的Activity將會(huì)被殺死)。把Activity2的啟動(dòng)模式改成singleTask,然后啟動(dòng)Fx_Main-跳轉(zhuǎn)到Activity2-Activity3-Actvity2此時(shí)看Log信息??梢姀腁c3再跳轉(zhuǎn)到Ac2時(shí),因?yàn)锳c2之前在棧中是存在的所以不生成新的Ac2實(shí)例,而是在棧中找到此Ac2,并將在Ac2上面的Ac3殺死,所以此時(shí)棧中只有Fx_Main和Ac2,在Ac2點(diǎn)返回會(huì)直接退到Fx_Main然后退出。singleInstance解釋singleInstance模式比較麻煩。首先要說一下Task(任務(wù))的概念。按照字面意思,任務(wù)就是自己要實(shí)現(xiàn)的一個(gè)目的,而在Android中的Task的定義是一系列Activity的集合,即要達(dá)到自己最終要到的Actvity,之前所有經(jīng)歷過的Actvity的集合。它可以是同一個(gè)應(yīng)用內(nèi)部的,也可以是兩個(gè)不同應(yīng)用的。Task可以認(rèn)為是一個(gè)棧,可放入多個(gè)Activity。比如啟動(dòng)一個(gè)應(yīng)用,那么 Android就創(chuàng)建了一個(gè)Task,然后啟動(dòng)這個(gè)應(yīng)用的入口Activity,就是intent-filter中配置為main和launch的那個(gè)。這個(gè)Activity是根(Root)Activity,可能會(huì)在它的界面調(diào)用其他Activity,這些Activity如果按照上面那三個(gè)模式,也會(huì)在這個(gè)棧(Task)中,只是實(shí)例化的策略不同而已。驗(yàn)證的辦法是調(diào)用和打印Activity的taskId通過this.getTaskId();會(huì)發(fā)現(xiàn),無論切換Activity,taskId是相同的。當(dāng)然也可以在這個(gè)單一的Task棧中,放入別人的Activity,比如google地圖,這樣用戶看過地圖按回退鍵的時(shí)候,會(huì)退?;氐秸{(diào)用地圖的Activity。對(duì)用戶來說,并不覺得在操作多個(gè)應(yīng)用。這就是Task的作用。可以理解為回退的作用是在先從當(dāng)前Actvity同一個(gè)Task進(jìn)行回退。但是,有這樣的需求,多個(gè)Task共享一個(gè)Activity(singleTask是在一個(gè)task中共享一個(gè)Activity)。現(xiàn)成的例子是google地圖。比如我有一個(gè)應(yīng)用是導(dǎo)游方面的,其中調(diào)用的google地圖Activity。那么現(xiàn)在我比如按home鍵,然后到應(yīng)用列表中打開google地圖,你會(huì)發(fā)現(xiàn)顯示的就是剛才的地圖,實(shí)際上是同一個(gè)Activity。如果使用上面三種模式,是無法實(shí)現(xiàn)這個(gè)需求的。google地圖應(yīng)用中有多個(gè)上下文Activity,比如路線查詢等的,導(dǎo)游應(yīng)用也有一些上下文Activity。在各自應(yīng)用中回退要回退到各自的上下文Activity中。singleInstance模式解決了這個(gè)問題(繞了這么半天才說到正題)。讓這個(gè)模式下的Activity單獨(dú)在一個(gè)task棧中。這個(gè)棧只有一個(gè)Activity。導(dǎo)游應(yīng)用和google地圖應(yīng)用發(fā)送的intent都由這個(gè)Activity接收和展示。這里又有兩個(gè)問題: 如果是這種情況,多個(gè)task棧也可以看作一個(gè)應(yīng)用。比如導(dǎo)游應(yīng)用啟動(dòng)地圖Activity,實(shí)際上是在導(dǎo)游應(yīng)用task棧之上 singleInstance模式創(chuàng)建的(如果還沒有的話,如果有就是直接顯示它)一個(gè)新棧,當(dāng)這個(gè)棧里面的唯一Activity,地圖Activity 回退的時(shí)候,只是把這個(gè)棧移開了,這樣就看到導(dǎo)游應(yīng)用剛才的Activity了; 多個(gè)應(yīng)用(Task)共享一個(gè)Activity要求這些應(yīng)用都沒有退出,比如剛才強(qiáng)調(diào)要用home鍵從導(dǎo)游應(yīng)用切換到地圖應(yīng)用。因?yàn)?,如果退出?dǎo)游應(yīng)用,而這時(shí)也地圖應(yīng)用并未運(yùn)行的話,那個(gè)單獨(dú)的地圖Activity(task)也會(huì)退出了。然后進(jìn)行測(cè)試,我們還是將Activity2的啟動(dòng)模式設(shè)置為singleInstance模式,然后啟動(dòng)Fx_Main-Actvity2-Actvity3然后看一下Log信息。可以看到Fx_Main以及Activity3的TaskID為9,而Actvity2的TaskID為10,此時(shí)在Actvity3點(diǎn)返回會(huì)發(fā)現(xiàn)先退到Fx_Main,繼續(xù)返回會(huì)到Actvity2最后退出。遺留問題:1. IntentFilter里設(shè)置優(yōu)先級(jí)無效,系統(tǒng)仍然會(huì)彈出activity選擇列表。解答:雖然優(yōu)先級(jí)定義是-10001000,但只有當(dāng)存在與負(fù)數(shù)比較時(shí),優(yōu)先級(jí)就會(huì)發(fā)生作用,即正數(shù)之間比較,以及正數(shù)與0之間比較都不會(huì)出現(xiàn)優(yōu)先級(jí)高低問題,但是正數(shù)與負(fù)數(shù),0與負(fù)數(shù),或者負(fù)數(shù)之間進(jìn)行比較,優(yōu)先級(jí)就會(huì)發(fā)揮作用,而且越大的優(yōu)先級(jí)越高。2. 如何顯式調(diào)用不同應(yīng)用之間的activity未解決3. 按照SDK中的說明使用singTask啟動(dòng)模式系統(tǒng)會(huì)在新task根部創(chuàng)建一個(gè)activity,并且將intent指向它。然而,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論