日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android四種Activity的加載模式

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

成都創(chuàng)新互聯(lián)公司是專業(yè)的高陵網(wǎng)站建設公司,高陵接單;提供成都網(wǎng)站設計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設公司,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行高陵網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

Android的進程,線程模型:

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

Android Application Task Activities的關系

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

一個Activty的生命周期

Activty的生命周期的也就是它所在進程的生命周期。

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

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

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

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

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

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

onResume :當一個活動和用戶發(fā)生交互的時候,觸發(fā)該方法。

onPause :當一個正在前臺運行的活動因為其他的活動需要前臺運行而轉入后臺運行的時候,觸發(fā)該方法。這時候需要將活動的狀態(tài)持久化,比如正在編輯的數(shù)據(jù)庫記錄等。

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

onRestart :當處于停止狀態(tài)的活動需要再次展現(xiàn)給用戶的時候,觸發(fā)該方法。

onDestroy :當活動銷毀的時候,觸發(fā)該方法。和 onStop 方法一樣,如果內存緊張,系統(tǒng)會直接結束這個活動而不會觸發(fā)該方法。

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

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

Activity棧

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

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

當一個新的Activity啟動時,當前的活動的Activity將會移到Activity棧的頂部。

如果用戶使用后退按鈕返回的話,或者前臺的Activity結束,在棧上的Activity將會移上來并變?yōu)榛顒訝顟B(tài)。如下圖所示:

一個應用程序的優(yōu)先級是受最高優(yōu)先級的Activity影響的。當決定某個應用程序是否要終結去釋放資源,Android內存管理使用棧來決定基于Activity的應用程序的優(yōu)先級。

#p#

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

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

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

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

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

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

activity的四種加載模式

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

在android里,有4種activity的啟動模式,分別為:

standard: 標準模式,一調用startActivity()方法就會產(chǎn)生一個新的實例。

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

singleTask: 會在一個新的task中產(chǎn)生這個實例,以后每次調用都會使用這個,不會去產(chǎn)生新的實例了。

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

這些啟動模式可以在功能清單文件AndroidManifest.xml中進行設置,中的launchMode屬性。

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

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

Activity的加載模式受啟動Activity的Intent對象中設置的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的目標task,和收到的Intent的發(fā)送者在同一個task內,就相當于誰調用它,它就跟誰在同一個Task中。

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

“singleTask”和”singleInstance” 總是把要啟動的activity作為一個task的根元素,他們不會被啟動到一個其他task里。

是否允許多個實例

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

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

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

是否允許其它activity存在于本task內

“singleInstance”獨占一個task,其它activity不能存在那個task里;

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

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

是否每次都生成新實例

“standard”對于每一個啟動Intent都會生成一個activity的新實例;

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

比如:

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

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

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

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

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

【編輯推薦】

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

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

Android應用——Activity傳參數(shù)與跳轉

Android Activity和Intent機制學習筆記


網(wǎng)站題目:Android四種Activity的加載模式
當前URL:http://www.dlmjj.cn/article/cdjepoe.html