




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、合抱之木,生於毫末;九層之臺(tái),起於累土;千里之行,始於足下。老子今天在社區(qū)看到有朋友問“如何在半年內(nèi)成為頂級(jí)架構(gòu)師”,有網(wǎng)友道“關(guān)燈睡覺,不用半年的.”,的確,做夢(mèng)還來的快一些。作為一個(gè)程序員,樹立遠(yuǎn)大的目標(biāo)是值得欣賞的,但不能只去空想,要一步一步地實(shí)踐才行。成大事者,須從小事做起;萬事起于忽微,量變引起質(zhì)變。我們今天要講的是Activity的四種launchMode。launchMode在多個(gè)Activity跳轉(zhuǎn)的過程中扮演著重要的角色,它可以決定是否生成新的Activity實(shí)例,是否重用已存在的Activity實(shí)例,是否和其他Activity實(shí)例公用一個(gè)task里。這里簡(jiǎn)單介紹一下task
2、的概念,task是一個(gè)具有棧結(jié)構(gòu)的對(duì)象,一個(gè)task可以管理多個(gè)Activity,啟動(dòng)一個(gè)應(yīng)用,也就創(chuàng)建一個(gè)與之對(duì)應(yīng)的task。Activity一共有以下四種launchMode:1.standard2.singleTop3.singleTask4.singleInstance我們可以在AndroidManifest.xml配置<activity>的android:launchMode屬性為以上四種之一即可。下面我們結(jié)合實(shí)例一一介紹這四種lanchMode:1.standardstandard模式是默認(rèn)的啟動(dòng)模式,不用為<activity>配置android:launc
3、hMode屬性即可,當(dāng)然也可以指定值為standard。我們將會(huì)一個(gè)Activity,命名為FirstActivity,來演示一下標(biāo)準(zhǔn)的啟動(dòng)模式。FirstActivity代碼如下:java view plaincopy1. package com.scott.launchmode; 2. 3. import android.app.Activity; 4. import android.content.Intent; 5. import android.
4、os.Bundle; 6. import android.view.View; 7. import android.widget.Button; 8. import android.widget.TextView; 9. 10. public class FirstActivity extends Activity 11. Overr
5、ide 12. public void onCreate(Bundle savedInstanceState) 13. super.onCreate(savedInstanceState); 14. setContentView(R.layout.fi
6、rst); 15. TextView textView = (TextView) findViewById(R.id.textView); 16. textView.setText(this.toString(); 17.
7、60; Button button = (Button) findViewById(R.id.button); 18. button.setOnClickListener(new View.OnClickListener() 19. Overr
8、ide 20. public void onClick(View v) 21. Intent intent = new Intent(Fi
9、rstActivity.this, FirstActivity.class); 22. startActivity(intent); 23. 24.
10、 ); 25. 26. 我們FirstActivity界面中的TextView用于顯示當(dāng)前Activity實(shí)例的序列號(hào),Button用于跳轉(zhuǎn)到下一個(gè)FirstActivity界面。然后我們連續(xù)點(diǎn)擊幾次按鈕,將會(huì)出現(xiàn)下面的現(xiàn)象:我們注意到都是FirstActivity的實(shí)例,但序列號(hào)不同,并且我們需要連續(xù)按后退鍵兩次,才能回到第一個(gè)FristActivity。standard模式的原理如下圖所示:如圖所示,每次跳轉(zhuǎn)系統(tǒng)都會(huì)
11、在task中生成一個(gè)新的FirstActivity實(shí)例,并且放于棧結(jié)構(gòu)的頂部,當(dāng)我們按下后退鍵時(shí),才能看到原來的FirstActivity實(shí)例。這就是standard啟動(dòng)模式,不管有沒有已存在的實(shí)例,都生成新的實(shí)例。2.singleTop我們?cè)谏厦娴幕A(chǔ)上為<activity>指定屬性android:launchMode="singleTop",系統(tǒng)就會(huì)按照singleTop啟動(dòng)模式處理跳轉(zhuǎn)行為。我們重復(fù)上面幾個(gè)動(dòng)作,將會(huì)出現(xiàn)下面的現(xiàn)象:我們看到這個(gè)結(jié)果跟standard有所不同,三個(gè)序列號(hào)是相同的,也就是說使用的都是同一個(gè)FirstActivity實(shí)例;如果按
12、一下后退鍵,程序立即退出,說明當(dāng)前棧結(jié)構(gòu)中只有一個(gè)Activity實(shí)例。singleTop模式的原理如下圖所示:正如上圖所示,跳轉(zhuǎn)時(shí)系統(tǒng)會(huì)先在棧結(jié)構(gòu)中尋找是否有一個(gè)FirstActivity實(shí)例正位于棧頂,如果有則不再生成新的,而是直接使用。也許朋友們會(huì)有疑問,我只看到棧內(nèi)只有一個(gè)Activity,如果是多個(gè)Activity怎么辦,如果不是在棧頂會(huì)如何?我們接下來再通過一個(gè)示例來證實(shí)一下大家的疑問。我們?cè)傩陆ㄒ粋€(gè)Activity命名為SecondActivity,如下:java view plaincopy1. package com.scott.launchmode;
13、160; 2. 3. import android.app.Activity; 4. import android.content.Intent; 5. import android.os.Bundle; 6. import android.view.View; 7. import android.widget.Button; 8. import android.widget.TextView
14、; 9. 10. public class SecondActivity extends Activity 11. Override 12. protected void onCreate(Bundle savedInstanceState) 13.
15、; super.onCreate(savedInstanceState); 14. setContentView(R.layout.second); 15. TextView textView = (TextView) findViewById(R.id.textView);&
16、#160; 16. textView.setText(this.toString(); 17. Button button = (Button) findViewById(R.id.button); 18. butto
17、n.setOnClickListener(new View.OnClickListener() 19. Override 20. public void onClick(View v)
18、0;21. Intent intent = new Intent(SecondActivity.this, FirstActivity.class); 22.
19、0; startActivity(intent); 23. 24. ); 25.
20、0; 26. 然后將之前的FirstActivity跳轉(zhuǎn)代碼改為:java view plaincopy1. Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 2. startActivity(intent); 是的,F(xiàn)irstActivity會(huì)跳轉(zhuǎn)到SecondActivity,SecondActivity又會(huì)跳轉(zhuǎn)到FirstActivity。
21、演示結(jié)果如下:我們看到,兩個(gè)FirstActivity的序列號(hào)是不同的,證明從SecondActivity跳轉(zhuǎn)到FirstActivity時(shí)生成了新的FirstActivity實(shí)例。原理圖如下:我們看到,當(dāng)從SecondActivity跳轉(zhuǎn)到FirstActivity時(shí),系統(tǒng)發(fā)現(xiàn)存在有FirstActivity實(shí)例,但不是位于棧頂,于是重新生成一個(gè)實(shí)例。這就是singleTop啟動(dòng)模式,如果發(fā)現(xiàn)有對(duì)應(yīng)的Activity實(shí)例正位于棧頂,則重復(fù)利用,不再生成新的實(shí)例。3.singleTask在上面的基礎(chǔ)上我們修改FirstActivity的屬性android:launchMode="si
22、ngleTask"。演示的結(jié)果如下:我們注意到,在上面的過程中,F(xiàn)irstActivity的序列號(hào)是不變的,SecondActivity的序列號(hào)卻不是唯一的,說明從SecondActivity跳轉(zhuǎn)到FirstActivity時(shí),沒有生成新的實(shí)例,但是從FirstActivity跳轉(zhuǎn)到SecondActivity時(shí)生成了新的實(shí)例。singleTask模式的原理圖如下圖所示:在圖中的下半部分是SecondActivity跳轉(zhuǎn)到FirstActivity后的棧結(jié)構(gòu)變化的結(jié)果,我們注意到,SecondActivity消失了,沒錯(cuò),在這個(gè)跳轉(zhuǎn)過程中系統(tǒng)發(fā)現(xiàn)有存在的FirstActivity實(shí)例
23、,于是不再生成新的實(shí)例,而是將FirstActivity之上的Activity實(shí)例統(tǒng)統(tǒng)出棧,將FirstActivity變?yōu)闂m攲?duì)象,顯示到幕前。也許朋友們有疑問,如果將SecondActivity也設(shè)置為singleTask模式,那么SecondActivity實(shí)例是不是可以唯一呢?在我們這個(gè)示例中是不可能的,因?yàn)槊看螐腟econdActivity跳轉(zhuǎn)到FirstActivity時(shí),SecondActivity實(shí)例都被迫出棧,下次等FirstActivity跳轉(zhuǎn)到SecondActivity時(shí),找不到存在的SecondActivity實(shí)例,于是必須生成新的實(shí)例。但是如果我們有ThirdAct
24、ivity,讓SecondActivity和ThirdActivity互相跳轉(zhuǎn),那么SecondActivity實(shí)例就可以保證唯一。這就是singleTask模式,如果發(fā)現(xiàn)有對(duì)應(yīng)的Activity實(shí)例,則使此Activity實(shí)例之上的其他Activity實(shí)例統(tǒng)統(tǒng)出棧,使此Activity實(shí)例成為棧頂對(duì)象,顯示到幕前。4.singleInstance這種啟動(dòng)模式比較特殊,因?yàn)樗鼤?huì)啟用一個(gè)新的棧結(jié)構(gòu),將Acitvity放置于這個(gè)新的棧結(jié)構(gòu)中,并保證不再有其他Activity實(shí)例進(jìn)入。我們修改FirstActivity的launchMode="standard",SecondAc
25、tivity的launchMode="singleInstance",由于涉及到了多個(gè)棧結(jié)構(gòu),我們需要在每個(gè)Activity中顯示當(dāng)前棧結(jié)構(gòu)的id,所以我們?yōu)槊總€(gè)Activity添加如下代碼:java view plaincopy1. TextView taskIdView = (TextView) findViewById(R.id.taskIdView); 2. taskIdView.setText("current task id: "
26、+ this.getTaskId(); 然后我們?cè)傺菔疽幌逻@個(gè)流程:我們發(fā)現(xiàn)這兩個(gè)Activity實(shí)例分別被放置在不同的棧結(jié)構(gòu)中,關(guān)于singleInstance的原理圖如下:我們看到從FirstActivity跳轉(zhuǎn)到SecondActivity時(shí),重新啟用了一個(gè)新的棧結(jié)構(gòu),來放置SecondActivity實(shí)例,然后按下后退鍵,再次回到原始棧結(jié)構(gòu);圖中下半部分顯示的在SecondActivity中再次跳轉(zhuǎn)到FirstActivity,這個(gè)時(shí)候系統(tǒng)會(huì)在原始棧結(jié)構(gòu)中生成一個(gè)FirstActivity實(shí)例,然后回退兩次,注意,并沒有退出,而是回到了SecondAct
27、ivity,為什么呢?是因?yàn)閺腟econdActivity跳轉(zhuǎn)到FirstActivity的時(shí)候,我們的起點(diǎn)變成了SecondActivity實(shí)例所在的棧結(jié)構(gòu),這樣一來,我們需要“回歸”到這個(gè)棧結(jié)構(gòu)。如果我們修改FirstActivity的launchMode值為singleTop、singleTask、singleInstance中的任意一個(gè),流程將會(huì)如圖所示:singleInstance啟動(dòng)模式可能是最復(fù)雜的一種模式,為了幫助大家理解,我舉一個(gè)例子,假如我們有一個(gè)share應(yīng)用,其中的ShareActivity是入口Activity,也是可供其他應(yīng)用調(diào)用的Activity,我們把這個(gè)Act
28、ivity的啟動(dòng)模式設(shè)置為singleInstance,然后在其他應(yīng)用中調(diào)用。我們編輯ShareActivity的配置:html view plaincopy1. <activity android:name=".ShareActivity" android:launchMode="singleInstance"> 2. <intent-filter> 3. <action android:name="ent.action.MAIN" /> 4. <category android:name=&quo
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國腎保養(yǎng)套裝數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國活性炭藝術(shù)墻數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 裝修物業(yè)備案合同范本
- 業(yè)務(wù)銷售合作合同范本
- 租賃標(biāo)準(zhǔn)車間合同范本
- 安全防護(hù)在在線廣告平臺(tái)的個(gè)人信息保護(hù)考核試卷
- 電子車輛秤行業(yè)相關(guān)投資計(jì)劃提議
- 工程經(jīng)濟(jì)分析考核試卷
- 2024年淄博桓臺(tái)縣事業(yè)單位招聘綜合類崗位筆試真題
- 2024年宜昌市“招才興業(yè)”教育系統(tǒng)事業(yè)單位專項(xiàng)招聘筆試真題
- 2025全國保安員考試題庫(含答案)
- 保安員資格考試復(fù)習(xí)題庫及答案(800題)
- 危重患者的安全轉(zhuǎn)運(yùn)課件
- 醫(yī)院藥事管理法律法規(guī)
- 幼兒園中班美術(shù)《開心帽》課件
- DB21T 3379-2021 黑參加工技術(shù)規(guī)程
- 2024解析:第九章液體壓強(qiáng)-基礎(chǔ)練(解析版)
- 2024解析:第十章 浮力、阿基米德原理及其應(yīng)用-講核心(解析版)
- 隱睪手術(shù)配合
- 華東師范大學(xué)《社會(huì)學(xué)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 建筑工程財(cái)務(wù)流程制度(6篇)
評(píng)論
0/150
提交評(píng)論