自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android四種Activity的加載模式

移動(dòng)開發(fā) Android
應(yīng)用程序組件都有一個(gè)生命周期,從響應(yīng)Intent的Android實(shí)例開始到這個(gè)實(shí)例被銷毀。在這期間,他們或許有效或許無效,有效時(shí)或許對(duì)用戶可見或許不可見。下面我們就來討論四個(gè)基本組件的生命周期,包括在生命周期內(nèi)的各種狀態(tài),以及狀態(tài)之間的轉(zhuǎn)換。這幾種狀態(tài)可能的結(jié)果是:進(jìn)程讓他們停止, 然后實(shí)例被銷毀。

建議首先閱讀下面兩篇文章,這樣才可以更好的理解Activity的加載模式:

Android的進(jìn)程,線程模型:

http://www.cnblogs.com/ghj1976/archive/2011/04/28/2031586.html 其中對(duì)“Android的單線程模型”的描述,明白Activity的一些注意事項(xiàng)。

Android Application Task Activities的關(guān)系

http://www.cnblogs.com/ghj1976/archive/2011/04/29/2032412.html  尤其要明白 Task 是啥。

一個(gè)Activty的生命周期

Activty的生命周期的也就是它所在進(jìn)程的生命周期。

每一個(gè)活動(dòng)( Activity )都處于某一個(gè)狀態(tài),對(duì)于開發(fā)者來說,是無法控制其應(yīng)用程序處于某一個(gè)狀態(tài)的,這些均由系統(tǒng)來完成。

但是當(dāng)一個(gè)活動(dòng)的狀態(tài)發(fā)生改變的時(shí)候,開發(fā)者可以通過調(diào)用 onXX() 的方法獲取到相關(guān)的通知信息。

在實(shí)現(xiàn) Activity 類的時(shí)候,通過覆蓋( override )這些方法即可在你需要處理的時(shí)候來調(diào)用。

onCreate :當(dāng)活動(dòng)第一次啟動(dòng)的時(shí)候,觸發(fā)該方法,可以在此時(shí)完成活動(dòng)的初始化工作。

onCreate 方法有一個(gè)參數(shù),該參數(shù)可以為空( null ),也可以是之前調(diào)用 onSaveInstanceState ()方法保存的狀態(tài)信息。

onStart :該方法的觸發(fā)表示所屬活動(dòng)將被展現(xiàn)給用戶。

onResume :當(dāng)一個(gè)活動(dòng)和用戶發(fā)生交互的時(shí)候,觸發(fā)該方法。

onPause :當(dāng)一個(gè)正在前臺(tái)運(yùn)行的活動(dòng)因?yàn)槠渌幕顒?dòng)需要前臺(tái)運(yùn)行而轉(zhuǎn)入后臺(tái)運(yùn)行的時(shí)候,觸發(fā)該方法。這時(shí)候需要將活動(dòng)的狀態(tài)持久化,比如正在編輯的數(shù)據(jù)庫記錄等。

onStop :當(dāng)一個(gè)活動(dòng)不再需要展示給用戶的時(shí)候,觸發(fā)該方法。如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)活動(dòng),而不會(huì)觸發(fā) onStop 方法。 所以保存狀態(tài)信息是應(yīng)該在onPause時(shí)做,而不是onStop時(shí)做?;顒?dòng)如果沒有在前臺(tái)運(yùn)行,都將被停止或者Linux管理進(jìn)程為了給新的活動(dòng)預(yù)留足夠的存儲(chǔ)空間而隨時(shí)結(jié)束這些活動(dòng)。因此對(duì)于開發(fā)者來說,在設(shè)計(jì)應(yīng)用程序的時(shí)候,必須時(shí)刻牢記這一原則。在一些情況下,onPause方法或許是活動(dòng)觸發(fā)的最后的方法,因此開發(fā)者需要在這個(gè)時(shí)候保存需要保存的信息。

onRestart :當(dāng)處于停止?fàn)顟B(tài)的活動(dòng)需要再次展現(xiàn)給用戶的時(shí)候,觸發(fā)該方法。

onDestroy :當(dāng)活動(dòng)銷毀的時(shí)候,觸發(fā)該方法。和 onStop 方法一樣,如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)活動(dòng)而不會(huì)觸發(fā)該方法。

onSaveInstanceState :系統(tǒng)調(diào)用該方法,允許活動(dòng)保存之前的狀態(tài),比如說在一串字符串中的光標(biāo)所處的位置等。

通常情況下,開發(fā)者不需要重寫覆蓋該方法,在默認(rèn)的實(shí)現(xiàn)中,已經(jīng)提供了自動(dòng)保存活動(dòng)所涉及到的用戶界面組件的所有狀態(tài)信息。 

Activity棧

上面提到開發(fā)者是無法控制Activity的狀態(tài)的,那Activity的狀態(tài)又是按照何種邏輯來運(yùn)作的呢?這就要知道 Activity 棧。

每個(gè)Activity的狀態(tài)是由它在Activity棧(是一個(gè)后進(jìn)先出LIFO,包含所有正在運(yùn)行Activity的隊(duì)列)中的位置決定的。

當(dāng)一個(gè)新的Activity啟動(dòng)時(shí),當(dāng)前的活動(dòng)的Activity將會(huì)移到Activity棧的頂部。

如果用戶使用后退按鈕返回的話,或者前臺(tái)的Activity結(jié)束,在棧上的Activity將會(huì)移上來并變?yōu)榛顒?dòng)狀態(tài)。如下圖所示:

一個(gè)應(yīng)用程序的優(yōu)先級(jí)是受最高優(yōu)先級(jí)的Activity影響的。當(dāng)決定某個(gè)應(yīng)用程序是否要終結(jié)去釋放資源,Android內(nèi)存管理使用棧來決定基于Activity的應(yīng)用程序的優(yōu)先級(jí)。

#p#

Activity狀態(tài) 一般認(rèn)為Activity有以下四種狀態(tài):

 

活動(dòng)的:當(dāng)一個(gè)Activity在棧頂,它是可視的、有焦點(diǎn)、可接受用戶輸入的。Android試圖盡最大可能保持它活動(dòng)狀態(tài),殺死其它Activity來確保當(dāng)前活動(dòng)Activity有足夠的資源可使用。當(dāng)另外一個(gè)Activity被激活,這個(gè)將會(huì)被暫停。

暫停:在很多情況下,你的Activity可視但是它沒有焦點(diǎn),換句話說它被暫停了。有可能原因是一個(gè)透明或者非全屏的Activity被激活。

當(dāng)被暫停,一個(gè)Activity仍會(huì)當(dāng)成活動(dòng)狀態(tài),只不過是不可以接受用戶輸入。在極特殊的情況下,Android將會(huì)殺死一個(gè)暫停的Activity來為活動(dòng)的Activity提供充足的資源。當(dāng)一個(gè)Activity變?yōu)橥耆[藏,它將會(huì)變成停止。

停止:當(dāng)一個(gè)Activity不是可視的,它“停止”了。這個(gè)Activity將仍然在內(nèi)存中保存它所有的狀態(tài)和會(huì)員信息。盡管如此,當(dāng)其它地方需要內(nèi)存時(shí),它將是最有可能被釋放資源的。當(dāng)一個(gè)Activity停止后,一個(gè)很重要的步驟是要保存數(shù)據(jù)和當(dāng)前UI狀態(tài)。一旦一個(gè)Activity退出或關(guān)閉了,它將變?yōu)榇脿顟B(tài)。

待用: 在一個(gè)Activity被殺死后和被裝在前,它是待用狀態(tài)的。待用Acitivity被移除Activity棧,并且需要在顯示和可用之前重新啟動(dòng)它。

activity的四種加載模式

在android的多activity開發(fā)中,activity之間的跳轉(zhuǎn)可能需要有多種方式,有時(shí)是普通的生成一個(gè)新實(shí)例,有時(shí)希望跳轉(zhuǎn)到原來某個(gè)activity實(shí)例,而不是生成大量的重復(fù)的activity。加載模式便是決定以哪種方式啟動(dòng)一個(gè)跳轉(zhuǎn)到原來某個(gè)Activity實(shí)例。

在android里,有4種activity的啟動(dòng)模式,分別為:

standard: 標(biāo)準(zhǔn)模式,一調(diào)用startActivity()方法就會(huì)產(chǎn)生一個(gè)新的實(shí)例。

singleTop: 如果已經(jīng)有一個(gè)實(shí)例位于Activity棧的頂部時(shí),就不產(chǎn)生新的實(shí)例,而只是調(diào)用Activity中的newInstance()方法。如果不位于棧頂,會(huì)產(chǎn)生一個(gè)新的實(shí)例。

singleTask: 會(huì)在一個(gè)新的task中產(chǎn)生這個(gè)實(shí)例,以后每次調(diào)用都會(huì)使用這個(gè),不會(huì)去產(chǎn)生新的實(shí)例了。

singleInstance: 這個(gè)跟singleTask基本上是一樣,只有一個(gè)區(qū)別:在這個(gè)模式下的Activity實(shí)例所處的task中,只能有這個(gè)activity實(shí)例,不能有其他的實(shí)例。

這些啟動(dòng)模式可以在功能清單文件AndroidManifest.xml中進(jìn)行設(shè)置,中的launchMode屬性。

相關(guān)的代碼中也有一些標(biāo)志可以使用,比如我們想只啟用一個(gè)實(shí)例,則可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 標(biāo)志,這個(gè)標(biāo)志表示:如果這個(gè)activity已經(jīng)啟動(dòng)了,就不產(chǎn)生新的activity,而只是把這個(gè)activity實(shí)例加到棧頂來就可以了。

  1. Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);    
  2. intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);    
  3. startActivity(intent);   

Activity的加載模式受啟動(dòng)Activity的Intent對(duì)象中設(shè)置的Flag和manifest文件中Activity的元素的特性值交互控制。

下面是影響加載模式的一些特性

核心的Intent Flag有:

FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
核心的特性有:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch

四種加載模式的區(qū)別

所屬task的區(qū)別

一般情況下,“standard”和”singleTop”的activity的目標(biāo)task,和收到的Intent的發(fā)送者在同一個(gè)task內(nèi),就相當(dāng)于誰調(diào)用它,它就跟誰在同一個(gè)Task中。

除非Intent包括參數(shù)FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK參數(shù),會(huì)啟動(dòng)到別的task里。

“singleTask”和”singleInstance” 總是把要啟動(dòng)的activity作為一個(gè)task的根元素,他們不會(huì)被啟動(dòng)到一個(gè)其他task里。

是否允許多個(gè)實(shí)例

“standard”和”singleTop”可以被實(shí)例化多次,并且是可以存在于不同的task中;這種實(shí)例化時(shí)一個(gè)task可以包括一個(gè)activity的多個(gè)實(shí)例;

“singleTask”和”singleInstance”則限制只生成一個(gè)實(shí)例,并且是task的根元素。

singleTop 要求如果創(chuàng)建intent的時(shí)候棧頂已經(jīng)有要?jiǎng)?chuàng)建的Activity的實(shí)例,則將intent發(fā)送給該實(shí)例,而不創(chuàng)建新的實(shí)例。

是否允許其它activity存在于本task內(nèi)

“singleInstance”獨(dú)占一個(gè)task,其它activity不能存在那個(gè)task里;

如果它啟動(dòng)了一個(gè)新的activity,不管新的activity的launch mode 如何,新的activity都將會(huì)到別的task里運(yùn)行(如同加了FLAG_ACTIVITY_NEW_TASK參數(shù))。

而另外三種模式,則可以和其它activity共存。

是否每次都生成新實(shí)例

“standard”對(duì)于每一個(gè)啟動(dòng)Intent都會(huì)生成一個(gè)activity的新實(shí)例;

“singleTop”的activity如果在task的棧頂?shù)脑?,則不生成新的該activity的實(shí)例,直接使用棧頂?shù)膶?shí)例,否則,生成該activity的實(shí)例。

比如:

現(xiàn)在task棧元素為A-B-C-D(D在棧頂),這時(shí)候給D發(fā)一個(gè)啟動(dòng)intent,如果D是 “standard”的,則生成D的一個(gè)新實(shí)例,棧變?yōu)锳-B-C-D-D。

如果D是singleTop的話,則不會(huì)生產(chǎn)D的新實(shí)例,棧狀態(tài)仍為A-B-C-D

如果這時(shí)候給B發(fā)Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會(huì)生成B的新實(shí)例,棧狀態(tài)變?yōu)锳-B-C-D-B。

“singleInstance”是其所在棧的唯一activity,它會(huì)每次都被重用。

“singleTask”  如果在棧頂,則接受intent,否則,該intent會(huì)被丟棄,但是該task仍會(huì)回到前臺(tái)。 當(dāng)已經(jīng)存在的activity實(shí)例處理新的intent時(shí)候,會(huì)調(diào)用onNewIntent()方法,如果收到intent生成一個(gè)activity實(shí)例,那么用戶可以通過back鍵回到上一個(gè)狀態(tài);如果是已經(jīng)存在的一個(gè)activity來處理這個(gè)intent的話,用戶不能通過按back鍵返回到這之前的狀態(tài)。

【編輯推薦】

Android開發(fā)中插入新的Activity

Android開發(fā):Activity之間的傳值

Android應(yīng)用——Activity傳參數(shù)與跳轉(zhuǎn)

Android Activity和Intent機(jī)制學(xué)習(xí)筆記

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2014-12-25 09:41:15

Android加載方式

2013-12-01 15:34:25

2018-12-05 16:25:14

2019-10-22 14:06:13

Docker軟件Linux

2012-05-10 15:44:22

Windows 8磁盤

2019-10-23 05:08:55

docker網(wǎng)絡(luò)模式網(wǎng)絡(luò)協(xié)議

2017-04-17 19:31:03

Android多線程

2013-06-14 15:24:57

Android開發(fā)移動(dòng)開發(fā)數(shù)據(jù)存儲(chǔ)方式

2010-07-14 09:15:30

云計(jì)算模式

2023-02-09 10:39:15

gRPC通信模式

2017-08-01 23:44:25

數(shù)據(jù)分析數(shù)據(jù)科學(xué)數(shù)據(jù)

2015-09-06 09:23:23

Android異步更新

2010-04-15 10:45:57

IE9渲染引擎

2019-03-08 10:36:13

云計(jì)算公共云云服務(wù)

2011-06-30 14:45:52

外鏈

2010-07-13 09:37:14

云計(jì)算模式

2017-07-27 14:01:51

大數(shù)據(jù)數(shù)據(jù)分析類型模式

2019-11-18 09:58:11

中間件投遞模式

2009-12-14 15:29:48

解決方案SOA安全

2014-07-24 10:06:46

智慧城市WIFI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)