



免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Activity啟動模式講解:姜成波日期:2011-4-21最近一直在看任務(wù)還有Activity啟動模式這塊,一直對這塊存在疑惑,為什么要有不同的啟動模式?使用這些會為我們的開發(fā)帶來什么好處?今天周討論,和同事們針對此問題,大家相互探討了一下。在多Activity開發(fā)中,有可能是自己應(yīng)用之間的Activity跳轉(zhuǎn),或者夾帶其他應(yīng)用的可復(fù)用Activity。也可能會希望跳轉(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中圖形界面中編輯:針對四種啟動模式,我做了一個(gè)小例子LaunchMode_Test,大家可以通過按照下面的操作修改例子啟動模式,來加深理解。三個(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模式,都會將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í)候會發(fā)現(xiàn),按多少遍按鈕,都是相同的Activity2實(shí)例,因?yàn)樵搶?shí)例在棧頂,因此不會創(chuàng)建新的實(shí)例。如果回退,回到Fx_Main,然后將退出應(yīng)用。singleTop模式,可用來解決棧頂多個(gè)重復(fù)相同的Activity的問題。如果是Fx_Main跳轉(zhuǎn)到Activity2,再跳轉(zhuǎn)到Fx_Main,行為就和standard一樣了,會在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)會檢查棧里面是否已經(jīng)有該Activity的實(shí)例。如果有直接將intent發(fā)送給它。(注意此時(shí)原在此Activity棧中上面的Activity將會被殺死)。把Activity2的啟動模式改成singleTask,然后啟動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)返回會直接退到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。比如啟動一個(gè)應(yīng)用,那么 Android就創(chuàng)建了一個(gè)Task,然后啟動這個(gè)應(yīng)用的入口Activity,就是intent-filter中配置為main和launch的那個(gè)。這個(gè)Activity是根(Root)Activity,可能會在它的界面調(diào)用其他Activity,這些Activity如果按照上面那三個(gè)模式,也會在這個(gè)棧(Task)中,只是實(shí)例化的策略不同而已。驗(yàn)證的辦法是調(diào)用和打印Activity的taskId通過this.getTaskId();會發(fā)現(xiàn),無論切換Activity,taskId是相同的。當(dāng)然也可以在這個(gè)單一的Task棧中,放入別人的Activity,比如google地圖,這樣用戶看過地圖按回退鍵的時(shí)候,會退?;氐秸{(diào)用地圖的Activity。對用戶來說,并不覺得在操作多個(gè)應(yīng)用。這就是Task的作用。可以理解為回退的作用是在先從當(dāng)前Actvity同一個(gè)Task進(jìn)行回退。但是,有這樣的需求,多個(gè)Task共享一個(gè)Activity(singleTask是在一個(gè)task中共享一個(gè)Activity)?,F(xiàn)成的例子是google地圖。比如我有一個(gè)應(yīng)用是導(dǎo)游方面的,其中調(diào)用的google地圖Activity。那么現(xiàn)在我比如按home鍵,然后到應(yīng)用列表中打開google地圖,你會發(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)用啟動地圖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)也會退出了。然后進(jìn)行測試,我們還是將Activity2的啟動模式設(shè)置為singleInstance模式,然后啟動Fx_Main-Actvity2-Actvity3然后看一下Log信息??梢钥吹紽x_Main以及Activity3的TaskID為9,而Actvity2的TaskID為10,此時(shí)在Actvity3點(diǎn)返回會發(fā)現(xiàn)先退到Fx_Main,繼續(xù)返回會到Actvity2最后退出。遺留問題:1. IntentFilter里設(shè)置優(yōu)先級無效,系統(tǒng)仍然會彈出activity選擇列表。解答:雖然優(yōu)先級定義是-10001000,但只有當(dāng)存在與負(fù)數(shù)比較時(shí),優(yōu)先級就會發(fā)生作用,即正數(shù)之間比較,以及正數(shù)與0之間比較都不會出現(xiàn)優(yōu)先級高低問題,但是正數(shù)與負(fù)數(shù),0與負(fù)數(shù),或者負(fù)數(shù)之間進(jìn)行比較,優(yōu)先級就會發(fā)揮作用,而且越大的優(yōu)先級越高。2. 如何顯式調(diào)用不同應(yīng)用之間的activity未解決3. 按照SDK中的說明使用singTask啟動模式系統(tǒng)會在新task根部創(chuàng)建一個(gè)activity,并且將intent指向它。然而,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保型工業(yè)廢氣監(jiān)測與排放達(dá)標(biāo)驗(yàn)收合同
- 2025年中國背面印刷油墨行業(yè)市場規(guī)模及未來投資方向研究報(bào)告
- 電影廣告素材版權(quán)使用許可協(xié)議
- 證券分析師職位全職聘用與業(yè)績激勵(lì)與職業(yè)規(guī)劃合同
- 無人機(jī)機(jī)械設(shè)計(jì)研發(fā)合作協(xié)議
- 教育培訓(xùn)廣告宣傳與招生服務(wù)協(xié)議
- 智能家居產(chǎn)品俄羅斯市場代理銷售與推廣協(xié)議
- 網(wǎng)紅甜品店區(qū)域代理合作協(xié)議及品牌授權(quán)經(jīng)營合同
- 直播平臺特色食品供應(yīng)鏈管理與選品協(xié)議
- 數(shù)據(jù)治理項(xiàng)目實(shí)施與效果評估合同
- 檢驗(yàn)科菌(毒)種及其樣品安全管理制度
- 水域救援課件教學(xué)課件
- (初級)航空油料特設(shè)維修員(五級)理論考試題庫-上(單選題)
- 尾礦庫安全規(guī)程
- 互聯(lián)網(wǎng)+時(shí)代電商助農(nóng)模式的優(yōu)化策略:以S縣為例9000字(論文)
- 《醫(yī)療器械監(jiān)督管理?xiàng)l例》知識競賽考試題庫300題(含答案)
- DL-T5024-2020電力工程地基處理技術(shù)規(guī)程
- 2024年上海市普通高中學(xué)業(yè)水平等級性考試化學(xué)試卷(含答案)
- 樹立正確就業(yè)觀課件
- 《在馬克思墓前的講話》課件+2023-2024學(xué)年統(tǒng)編版高中語文必修下冊
- 第24屆世界奧林匹克數(shù)學(xué)競賽WMO省級測評五年級試卷【含答案】
評論
0/150
提交評論