android某500強(qiáng)學(xué)習(xí)-第二章基礎(chǔ)知識_第1頁
android某500強(qiáng)學(xué)習(xí)-第二章基礎(chǔ)知識_第2頁
android某500強(qiáng)學(xué)習(xí)-第二章基礎(chǔ)知識_第3頁
android某500強(qiáng)學(xué)習(xí)-第二章基礎(chǔ)知識_第4頁
android某500強(qiáng)學(xué)習(xí)-第二章基礎(chǔ)知識_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二Android基礎(chǔ)知Android是什么(Simon翻譯自 /guide/basics/what-is-Android是一個面向移動設(shè)備的軟件堆層(softwarestack),包含了一個操作系統(tǒng),中間件和關(guān)鍵的應(yīng)用序。AndroidSDK提供了必要的工具和API,你可以在這些的基礎(chǔ)上使用java編語言開發(fā)Android平臺上的應(yīng)用序。特應(yīng)用序框 Dalvik虛擬 面向常見的音頻、以及靜態(tài)圖形格式(MPEG4,H。264,GSM技 Bluetooth,EDGE,3G,和 Camera,GPS,compass,和 豐富的開發(fā)環(huán)境包含一套硬件仿真器,一些用于序調(diào)試、內(nèi)存和性能 剖析的工具,以及支持Eclipse集成開發(fā)環(huán)境的插件(ADT)。Android應(yīng)Android將預(yù)裝一組應(yīng)用序,包括客戶端、服務(wù)、日歷日、地圖服務(wù)、瀏覽器、聯(lián)系人和其他應(yīng)用序。所有應(yīng)用序都是Java編語言編寫的。應(yīng)用框通過提供一個開放的開發(fā)平臺,開發(fā)者使用Android可以開發(fā)出極為豐富且新穎的應(yīng)用序。開發(fā)者可以自由地利用設(shè)備硬件優(yōu)勢、位置信息、運行服務(wù)、設(shè)置鬧鐘、向有對用用架I的完全權(quán)力。應(yīng)用序框架的設(shè)計旨在簡化組件的復(fù)用;所有應(yīng)用序都可以發(fā)布其能力。任何應(yīng)用序都可以發(fā)布自己的功能,然后其他任何應(yīng)用序都可以使用這些功能(需要符合框架強(qiáng)制要求的安全約束)。一組豐富和可擴(kuò)展的,可以用來構(gòu)建應(yīng)用序的視圖組件,含有l(wèi)ists,grids,textProvider( NotificationManager(通知管理器),使所有的應(yīng)用序在狀態(tài)欄顯示自定義的警告ActivityManager(活動管理器)負(fù)責(zé)管理應(yīng)用序的生命周期,提供通用導(dǎo)航回退應(yīng)用序細(xì)節(jié),請參考"記事本"。庫應(yīng)用序框架提供給開發(fā)者。下面列舉一些庫:系統(tǒng)C庫——基于BSD的標(biāo)準(zhǔn)C系統(tǒng)庫(libc)實現(xiàn),移植到了Linux——基于Packet的OpenCORE;支持很多流行音頻和格式、靜態(tài)圖形文件(包括MPEG4,H。264,MP3,AAC,AMR,JPG和PNG)的和錄制時)或者內(nèi)置的、高度優(yōu)化的3D軟件加速機(jī)制。FreeType——Android運行時刻(AndroidAndroid的類庫提供Java類庫所提供的絕大部分功能每個Android應(yīng)用序都通過Dalvik虛擬機(jī)在自己的進(jìn)中運行。Dalvik被設(shè)計來使一臺設(shè)備有效地運行多個虛擬機(jī)。Dalvik虛擬機(jī)執(zhí)行的是Dalvik格式的可執(zhí)行文件(。dex)——Java編譯器編譯的類,這些類通過Android內(nèi)置的“dx”工具編譯成了。dex格式。LinuxAndroid應(yīng)用序基(Simon翻譯自Android應(yīng)用序是用java語言寫的,通過aapt工具把編譯好的java代碼和應(yīng)用序所需要的所有數(shù)據(jù)、資源文件打包成Android包,即后綴為.apk的壓縮文件,這個文件是發(fā)布應(yīng)用序和在移動設(shè)備上安裝應(yīng)用序的媒介,是用戶到他們設(shè)備上的文件。一個.apk默認(rèn)每個應(yīng)用序在自己的Linux進(jìn)中運行,當(dāng)應(yīng)用序中的任何代碼需要執(zhí)行時android就啟動一個的進(jìn),當(dāng)不再需要或系統(tǒng)資源被其他應(yīng)用序請求時android就關(guān)每個進(jìn)都有其專屬的Java虛擬機(jī)(VM),所以應(yīng)用序代碼運行時與其他的應(yīng)用序是彼此的。LinuxID,由于權(quán)限設(shè)置的原因,一個應(yīng)用可以為兩個應(yīng)用序安排使用同一個用戶ID,這種情況下他們彼此之間是可以看見對方的應(yīng)用序組件(ApplicationAndroid一個特點就是一個應(yīng)用序能使用另一個應(yīng)用序的元素(在提供元素的應(yīng)用序允許的情況下。例如,如果你的應(yīng)用序想要顯示一個滑動列表,另一個應(yīng)用序正巧開發(fā)了合適的滑動模塊,并且同意共享,你就可以調(diào)用那個滑屏模塊處理這些并顯示出來,而不是自己再去開發(fā)一個。你的應(yīng)用序并沒有包含或了提供元素實例化那部分Java對象。因此,和其他大多數(shù)系統(tǒng)不同的是,android應(yīng)用序沒有一個單獨的序(例如:沒有main函數(shù)。而是包含運行所需的必要組件,使得系統(tǒng)可以實例化對象。android中有四種組件:活動(一個用戶可選的菜單項的列表,或是顯示帶有標(biāo)題的。一個文本信息應(yīng)用序可選定的聯(lián)系人,其它的活動用于查看舊的消息或者顯示設(shè)置的界面。雖然它們作為一個整體的用戶界面進(jìn)行協(xié)同工作,但是每一個活動都是相對獨立的。每一個活動都是活動基類(類Activity的一個子類實現(xiàn)。一個Andoid應(yīng)用可由一個活動組成,或者像上面提到的文本信息應(yīng)用序一樣包含了多個活動?;顒邮鞘裁礃拥囊约靶枰嗌俚幕顒?,這些取決于你的應(yīng)用序是如何設(shè)計的。最典型的是將一個活動被標(biāo)記為第一個,當(dāng)應(yīng)用被加載時顯示給用戶。從每個活動提供了一個用于繪制的默認(rèn)窗口。通常窗口將占滿整個屏幕,但是也有可能比屏幕小并且浮在另一個窗口的上面。一個活動可以使用多個窗口——例如,在活動顯示一個需要用戶回應(yīng)的彈出框,或者當(dāng)用戶選擇屏幕上一個特定項目時為viewviewview(層次底活動和用戶交互的地方。例如,一個view顯示一個小,當(dāng)用戶點擊這個后開始一個操作。Android有很多已經(jīng)做好的view你可以選擇使用,包括按鈕,文本輸入Activity.setContentView()view層放置到一個活動窗口中,contentview是view層中最頂端的那個view。(參見UserInterface的文檔獲取有關(guān)view服務(wù)服務(wù)沒有可見的用戶界面,但是可以在運行任意長的時間。例如,一個服務(wù)可以在用戶轉(zhuǎn)向其他工作后仍然在音樂,或者從網(wǎng)上數(shù)據(jù),或者計算一些東西然后在需要的時候提供給活動。每個服務(wù)都繼承自Service基類。一個主要的例子就是從列表中音樂的器。器序可能會有一個或幾個活動,這些活動可以讓用戶選擇希望的音樂然后顯示。但是音樂過本身為了保持繼續(xù),器的活動可以啟動一個在運行的服務(wù)。然后即使啟動這個服務(wù)的活動退出,音樂服務(wù)也能繼續(xù)運行。的組件或者用戶界面,服務(wù)經(jīng)常為那些耗時長的任務(wù)單獨開一個線(比如音樂)。廣播(Broadcast——-比如反應(yīng)時區(qū)變化,電量低,照了一張,或者用戶修改了系統(tǒng)語言。應(yīng)用序也可以自己定義廣播,比如定義這樣一個廣播,讓其他的應(yīng)用序知道某些數(shù)據(jù)已經(jīng)完畢了可以使用了。應(yīng)用序可以有任意數(shù)量的廣播來對他所關(guān)心的廣播進(jìn)行并作出反應(yīng)。所有的廣播都繼承自BroadcastReceiver基類。廣播不顯示在用戶界面上,但是可以啟動一個活動來對接收到的信息進(jìn)行響應(yīng),或者可以使用BroadcastReceiver來警告用戶。Notifications(通知)可以通過不同的方式引起用戶的注意,比如使背景燈閃爍,使設(shè)備振動,聲音等等。通常是在狀態(tài)欄上顯示一個不會的圖標(biāo),用戶可以打開這個圖標(biāo)查看通知。內(nèi)容提供者(Content數(shù)據(jù)庫中,或者任何其他可以存數(shù)據(jù)的地方。內(nèi)容提供者繼承自ContentProviderContentResolver對象,然后調(diào)用這個對象的方法。ContentResolver可以和任何的內(nèi)容提供者交流,它和提供者協(xié)作來管理所有涉及到的進(jìn)無論何時請求都應(yīng)該由一個特定的組件來處理,Android將確認(rèn)組件的應(yīng)用序進(jìn)是否處激活組件當(dāng)有一個來自于contentresolver的請求指向內(nèi)容提供者時,內(nèi)容提供者被激活。其他的三個組件——活動,服務(wù),廣播——是通過一個叫做intent的異步的消息來激活的,intent持有異步消息的內(nèi)容。對于活動和服務(wù),它主要是為被請求的動作命名,然后指定需要操作的數(shù)據(jù)的URI。例如,它可能攜帶讓一個活動為用戶展現(xiàn)一張或者讓用戶編輯文本的請求。對于廣播,intent對象為將要廣播的內(nèi)容命名。例如,它可能會通知活動(或者新的任務(wù))是通過傳遞一個Intent對象到Context.startActivity或者動的原始intent。Android調(diào)用Activity.onNewIntent()方法來傳遞之后的intent。一個活動常常會啟動下一個活動。如果前一個活動希望下一個啟動的活動返回一個結(jié)果,那么它將調(diào)用startctviyForReult()而不是sartActviy()。例如,如果一個老活動被調(diào)用的活動的onActivityResult()方法的Intent對象返回服務(wù)是通過傳遞Intent對象到Context.startService()來啟動的(或者將新令指派給正service,andoiIntentContext.bindService()方法里來建立呼叫組件與被叫一個與前面提及的音樂服務(wù)的連接,這樣它就能夠提供控制的方式給用戶(一個用戶界面)。activity將調(diào)用bindService()service定義的方法來進(jìn)行。初始化broadcast可以通過傳遞一個Intent對象給諸如Context.sendBroadcast()、Context.sendOrderedBroadcast()Context.sendStickyBroadcast()方法。Android通過調(diào)用它們的onReceive()方法,將intent傳遞給所有感的broadcastreceiver。想要了解的intent信息,參照另一篇文檔,IntentsandIntentFilters關(guān)閉組件(Shuttingdown一個contentprovider僅僅在它響應(yīng)從ContentResolver來的請求時處于活躍狀態(tài)。一個broadcastreceiver僅僅在它響應(yīng)broadcast信息時處于活躍狀態(tài)。所以沒必要顯示地關(guān)閉這些另一方面,Activity提供用戶界面。它們會與用戶長時間地,而且可能在整個過中,即使處于空閑狀態(tài),都保持活躍狀態(tài)。同樣的,service也可能長時間保持運行狀態(tài),所以Android提供了下列關(guān)閉activity和service的方法:Activity可以通過調(diào)用它自己的finish()方法來關(guān)閉。一個Activity也可以通過調(diào)用servicestopSelf()Context.stopService()方法來結(jié)當(dāng)組件不再使用時或者android為了別的更活躍的組件能運行而回收內(nèi)存時,android系統(tǒng)會關(guān)閉這些組件,在后面介紹組件生命周期的部分會有詳細(xì)的介紹。manifest文件(Themanifest在Android啟動一個應(yīng)用序組件之前,它必須知道該組件確實存在。因此,應(yīng)用序打包在了Android包中,即.apkmanifest是一個結(jié)構(gòu)化的XML格式文件,對所有應(yīng)用序它都是命名為AndroidManifest.xml。除應(yīng)用序組件之外,它還做一些別的事情,例如為所有應(yīng)用序需要進(jìn)行連接的庫命名(除默認(rèn)Android庫)以及識別所有應(yīng)用序期望獲得的權(quán)限。<manifest......<activity>name屬性指定實現(xiàn)了activityActivity子類。iconlabel屬性指向包括一個圖標(biāo)和的資源文件,這些資源文件可以在activity被顯示時顯示給用戶。<receiver>元素,contentprovider則使用<provider>元素。系統(tǒng)將無法看到?jīng)]有在manifest里的activity,service以及contentprovider,當(dāng)然也就無法運行它們。但是broadcastreceiver既可以在manifest里,也可以在代碼里動態(tài)創(chuàng)建(如創(chuàng)建BroadcastReceiver對象),然后通過調(diào)用Context.registerReceiver()到系統(tǒng)里。Intent過濾器(Intent<manifest...<application... Intent對象能夠明確的指定一個目標(biāo)組件。如果它指定了,Android將找到那個組件(根據(jù)manifest文件里的)并激活它。但是如果目標(biāo)沒有被明確的被指定,Android就必須找到最佳的組件來響應(yīng)intent。Android將Intent對象與intentfilter中可能的目標(biāo)組件相比較來找出最佳的組件。組件的intentfilter通知Android該組件所能夠使<manifest...<application... 例子中的第一個filter的動作action.MAIN和category.LAUNCHER組合是很常見一種。它標(biāo)識這個activity要在應(yīng)用序啟動器屏幕中被列出,就是可以列出設(shè)備上用戶可用的的應(yīng)用序的那個屏幕。換句話說,該activity是應(yīng)用序的點,是用戶在應(yīng)用序啟動器上選擇該應(yīng)用序時所看到的初始的activity。一個組件可以有任意數(shù)量的intentfilter,每一個這個組件的一種能力。如果一個組件不含任何filter,它只能夠被明確指定作為目標(biāo)組件的intent激活。對于在代碼里生成和的broadcastreceiver,intentfilter將作為IntentFilter對象直接實例化。所有其他filter都是在manifest中創(chuàng)建?;顒雍腿蝿?wù)(Activitiesand上文提到,一個Activity可以啟動另一個Activity,即使這個Activity是定義在另一個應(yīng)用ActivityIntentIntent對象傳遞給startActivity(),地圖就可以顯示出來了,但用戶按下BACK鍵之后,你的Activity又重新出現(xiàn)在屏幕上。對用戶來說,顯示地圖的Activity和你的Activity好像在一個應(yīng)用序中的,雖然是他們是定義在其他的應(yīng)用序中并且運行在那個應(yīng)用進(jìn)中。android將你的Activity和借用的那Activitytask里,以維持用戶體驗。簡單來講,task就是用戶覺得好像是一個"應(yīng)用序"的東西。task是以棧的形式組織起來的一組相互關(guān)聯(lián)的Activity,,棧中底部的Activity就是開辟這個task的,通常是用戶在應(yīng)用序啟動器中選擇的Activity。,棧頂部的Activity是當(dāng)前正在運行的Activity——用戶正在交互操作的Activity。當(dāng)一個Activity啟動另一個Activity時,新啟動的Activity被壓進(jìn)棧中,成為正在運行的Activity。舊的ActivityBACKActivityActivity地圖瀏覽器——則棧對每一個實例都有一個單獨的。棧中的Activity不會被重新排序,task是一組Activity實例組成的棧,不是在manifest文件里的某個類或者元素,所以無法設(shè)定一個task的屬性而不管它的Activity,一個task的所有屬性值是在底部的Activity里設(shè)置的。例如,下一節(jié)會講到"任務(wù)的affinity",affinity信息就是從底部Activity中獲取的。task里的所有Activitytask(Activity堆棧)可以被送到前臺或者被推到。假設(shè)一個正在運行的task中有四個Activity——正在運行的Activity下面有三個Activity,這時用戶按下HOME鍵,回到應(yīng)用序啟動器然后運行新的應(yīng)用序(實際上是一個新的task),那么當(dāng)前的task就退到,新開啟的應(yīng)用序的rootActivity此時就顯示出來了;一段時間后,用戶又回到應(yīng)用序啟動器,又重新選擇了之前下BACK鍵時,屏幕不是顯示剛剛離開的新開啟的那個應(yīng)用序的Activity,而是移除回到前臺的這個task的棧頂Activity,將這個task的下一個Activity顯示出來。以上描述的情況是Activity和task默認(rèn)的行為,但是那個行為的幾乎所有方面都是可以修改的。ActivitytasktaskActivityActivityIntent對象的標(biāo)識和在manifest文件中的Activity的<activity>元素的屬性共同影響的。 affinity和新tasks(Affinitiesandnew默認(rèn)的,一個應(yīng)用序中的所有Activity都有血緣關(guān)系——就是都屬于同一個task的。但是,可以通過<activity>元素下的taskAffinity屬性來為某個Activity設(shè)置單獨的affinity。定義在不同應(yīng)用序中的Activity可以共種affinity,或者一個應(yīng)用中的不同的Activity可以定義不同的affinity。affinity滿足以下兩種情況時起作用:一是當(dāng)啟動Activity的Intent對象FLAG_ACTIVITY_NEW_TASK標(biāo)志時,二是當(dāng)ActivityallowTaskReparenting屬FLAG_ACTIVITY_NEW_TASK如前面提到的,默認(rèn)情況下,ActivitystartActivity()Activity時,新Activitytaskstartactivity()Intent對象含有FLAG_ACTIVITY_NEW_TASK標(biāo)志,系統(tǒng)就會尋找一個新的task來裝這個新的Activity。通常就如控制標(biāo)識的字面的意思一樣,它是一個新的task。然而并不是一定taskActivityaffinity,那么就把這個新的Activity放進(jìn)那個task里,如果沒有,就啟動一個新的task。allowTaskReparenting屬如果一個Activity的allowTaskReparenting屬性設(shè)置為true,這個Activity就可以從啟動時的那個task移動到一個和它有相同affinity的前臺的一個task里去,比如,假設(shè)現(xiàn)在Activityaffinity(affinity),并且允許重定父級。現(xiàn)在你自己的應(yīng)用序中有一個Activity啟動這個天氣預(yù)報的Activity,那么天氣預(yù)報Activity就會移動到你的Activity所在的task里,當(dāng)旅行的應(yīng)用序回到前臺時,天氣預(yù)報Activity重task并顯示。(譯者注:如果說沒有設(shè)置這個屬性,或者這個屬性設(shè)置為falseActivity調(diào)用另一個應(yīng)用里的Activity時,系統(tǒng)是為另一個應(yīng)用里的Activity創(chuàng)建一個實例,然后放到同一個task里,但是如果設(shè)置了allowTaskReparenting為true,那么另一個應(yīng)用里的Activity是可以在不同的task間來回移動的,那個task臺就移動到那個task里)如果從用戶的角度來看,一個.apk文件里包含不止一個"應(yīng)用序"的話,你將可能會給每個activity指定不同的affinity來關(guān)聯(lián)它們。啟動模式(Launch IntentActivity將被裝入哪task。standardsingleTop模式,由產(chǎn)生該Intent(調(diào)用startActivity())的task持有該Activity——除非Intent對象里含有FLAG_ACTIVITY_NEW_TASK標(biāo)志,那么就像前面章節(jié)講的那樣的尋找一個新的相反的,singTasksingleInstance模式,總是標(biāo)志ActivitytaskrootActivity,開啟這樣的活動會新建一個task,而不是裝入某個正在運行的任務(wù)。一個Activity是否可以有多個實例。standardsingleTop屬性Activity可以實例化多次,他們可以屬于多個不同的task,而且一個task也可以含有相同Activity的多這些Activity是位于task的底部,這種限制意味著同一設(shè)備的同一時刻該task只能有一實例是否能允許在它taskActivity。singleInstanceActivitytaskActivityActivityActivity會被加載進(jìn)一個不同的task而無視它的啟動模式——就如Intent里有FLAG_ACTIVITY_NEW_TASK標(biāo)識一樣。在其他的方面,singleInstancesingleTasktaskrootActivityActivityActivity裝進(jìn)同一個task里,standard和singleTop屬性的Activity可以出現(xiàn)在task的任何位置。是否創(chuàng)建一個新的Activity實例來處理一個新的Intent。對于默認(rèn)的standard方式,將task的棧頂,那么就重用這個實例來處理這個新的Intent,如果這個實例存在但是不在棧頂,那就不重用他,而是重新創(chuàng)建一個實例來處理這個新的Intent并且將這個實例壓入棧。例如現(xiàn)在有一個taskABCD,A是rootActivity,D是棧頂Activity,現(xiàn)在有一個啟DIntentDstandard方法,那么就會創(chuàng)建一個新的實例來處理這個Intent,所以這個堆棧就變?yōu)锳BCDD,然而如果DsingleTop方式,這個已經(jīng)存在的棧頂?shù)腄就會來處理這個Intent,所以堆棧還是ABCD。現(xiàn)在B不在棧頂),都會創(chuàng)建一個新的實例,所以堆棧變?yōu)锳BCDB。們的實例就會處理所有的新intent。一個"singleInstance"activity總是在棧里的最上面(因為它是task里的唯一的activity),這樣它總是可以處理一個intent。而一個"singleTask"activityactivity在它上面。如果有的話,它就不intent進(jìn)行處理,intent將被丟棄。(intenttaskActivityIntent時,IntentonNewIntent()的調(diào)用傳遞給這個活動。(傳遞進(jìn)來的原始的Intent對象可以通過調(diào)用getIntent()獲取)。注意,當(dāng)創(chuàng)建一個新的Activity的實例來處理一個新收到的Intent時,用戶可以按BACK鍵時,用戶不能通過按下BACK鍵回到這個實例在接受到新Intent之前的狀態(tài)。清理堆棧(ClearingthetasktaskrootActivity以外的所有的Activity,當(dāng)用戶再次使用這個task時,顯示的是rootActivity。之所以這樣做是認(rèn)為,用戶長時間不使用這個task,就很可能是希望放棄他們之前的操作,再次回到這個task就述的默認(rèn)情況就不會出現(xiàn)了,無論用戶多長時間沒有使用task,task也會一直保留棧中所有的Activity。如果一個task里的rootActivity的clearTaskOnLaunch屬性設(shè)置為true,和alwaysRetainTaskStatetaskrootActivity以外的所有Activity,task變回初始的狀態(tài)。finishOnTaskLaunch屬這個屬性和clearTaskOnLaunch一樣,但是他是對一個Activity起作用,不是整個task,他能引起所有的Activity離開,包括rootActivity,當(dāng)這個屬性設(shè)置為true,只是當(dāng)用戶使用這個應(yīng)用序時Activity才在task里,一旦用戶離開該task后重新回來,該Activity不再存在。taskActivity,如果一個IntentFLAG_ACTIVITY_CLEAR_TOP標(biāo)志,并且目標(biāo)task里已經(jīng)有一個可以處理此Intent的Activity實例,那么在棧中這個Activity之上的所有Activity將被清除,這時這個Activity就IntentActivity的啟動模式是"standard"ActivityActivityIntent。這是因為如果啟動模式是"standard",那么每一個Intent都會用一個新的實例進(jìn)行處理。FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_NEW_TASK一起使用。同時使用時,這個組合是找到另一個task中的已有Activity然后將它轉(zhuǎn)入新的task中以響應(yīng)一個Intent的法。啟動任務(wù)(Starting可以通過將activityintentfilteraction指定為“ent.action.MAIN”,以及類別(關(guān)于這種類型的filter,在上面的章節(jié)的IntentFilters里有一個例子)。一個該類型的filter使該activity的圖標(biāo)和顯示在應(yīng)用序啟動器(launcher)上,這樣就提供給用戶一個方法,第二個功能很重要:用戶必須能夠在離開一個task后回到這個task?!皊ingleTask”和“singleInstance”這兩種啟動模式的activity總是啟動一個task,所以只有當(dāng)activiay有MAINLAUNCHERfilterfilteractivity中使用將會task中做了一些操作,然后用戶按下HOME鍵。這個activity就退到,但是由于這個activity不在應(yīng)用序啟動器(launcher)中顯示,用戶無法再回到那個activity中了。FLAG_ACTIVITY_NEW_TASK控制標(biāo)識時也會出現(xiàn)。如果該標(biāo)識使一activitytaskHOMEactivity,也沒有辦法再回來了。一些東西(例如通知管理器)taskactivity,而從來不在自己的task中打開,所以它們總是將包含F(xiàn)LAG_ACTIVITY_NEW_TASK的Intent傳遞給startActivity()。所以如果你有一個可以被其他的東西以這個控制標(biāo)志調(diào)用的activity,請注意用戶有獨立的回到這個activity的方法。如果你希望用戶離開activity之后就不能回到這個activity,可以將<activity>元素的finishOnTaskLaunch的值設(shè)為"true"。參照之前的Clearingthestack。進(jìn)和線(Processesand當(dāng)應(yīng)用序第一個組件需要運行時,android系統(tǒng)就為這個組件分配一個Linux進(jìn),這個進(jìn)只有一個運行線。默認(rèn)這個應(yīng)用序所有組件都運行這個進(jìn)中的這個線中。進(jìn)<receiver>和<provider>——都有一個process屬性來指定組件運行在哪個進(jìn)中。你可以通過設(shè)置這個屬性,使得每個組件運行在它們自己的進(jìn)中,或者幾個組件共個進(jìn),或者不共享。你甚至可以設(shè)定位于不同的應(yīng)用序中的組件運行在同一個進(jìn)中——這兩個不同的應(yīng)用序需要由同一作者簽名,并且同一個linux用戶ID,<application>元素也有一個process屬性,用來指定所有組件的默認(rèn)屬性。所有的組件都在指定的進(jìn)中的主線中實例化的,對組件的系統(tǒng)調(diào)用也是由主線發(fā)出View.onKeyDown()和后面討論的組件生命周期通知函數(shù)——都是運行在這個主線中的。當(dāng)內(nèi)存不足并且有其他更緊急的進(jìn)請求時,Android系統(tǒng)可能結(jié)束一個進(jìn),運行在這個Android權(quán)衡進(jìn)的重要性來決定結(jié)束哪個進(jìn)。例如,一個在的進(jìn)比正在顯示的進(jìn)更容易被結(jié)束。是否要結(jié)束某個進(jìn)是由里面運行的組件的狀態(tài)決定的。組件的狀態(tài)在線即使你限制了你的應(yīng)用序運行在一個進(jìn)中,但是有的時候你可能需要新開一個線運行。因為用戶界面需要隨時對用戶的動作做出反應(yīng),所以一些很耗時的工作應(yīng)該重線進(jìn)。線代碼中使用標(biāo)準(zhǔn)的javaThread對象來建立,Android系統(tǒng)提供了一系列方便的類來管理線——Looper用來在一個線執(zhí)行消息循環(huán),Handler處理消息,HandlerThread創(chuàng)建調(diào)用(Remoteprocedure系統(tǒng)可以識別的級別,將數(shù)據(jù)從本地進(jìn)和地址空間傳遞到的進(jìn)和地址空間,并在遠(yuǎn)端重新裝配和組織。返回數(shù)據(jù)的時候傳輸方向相反,android系統(tǒng)會去做這些傳輸?shù)墓ぷ鳎屇隳軌蚣芯矶x你的RPC接口。一個RPC接口可以只包含包含方法,所有的方法都是同步執(zhí)行的(本地方等待方簡單的說,RPC機(jī)制是這樣工作的:首先你需要用IDL(接口定義語言)你想要實現(xiàn)進(jìn)都是可用的,這個java接口中包含了兩個內(nèi)部類,如下圖所示:這兩個內(nèi)部類管理你用IDL的接口的調(diào)用的所有代碼,兩個內(nèi)部類都實現(xiàn)IBinder接口,一個是在系統(tǒng)在本地,你自己寫的代碼可以忽略它。另外一個叫做Stub,繼承自Binder類。除了包含執(zhí)行IPC調(diào)用的代碼,還包含你在的RPC接口中的方法的,你應(yīng)該繼續(xù)繼承Stub類來實現(xiàn)這些方法,就像圖中所示。接相關(guān)情況通知給系統(tǒng))serviceaidlRPC方法的實現(xiàn)的Stub的子類。service的客戶端將只有aidl工具生成的接口文件。這樣當(dāng)一個到service連接建立或斷開的時候,客戶端可以得到這一消息。然后客戶端將調(diào)用bindService()方法來設(shè)置這個連接?,F(xiàn)接受或者連接。如果連接被接受,該方法返回一個Stub子類的實例。如果該service接受了該連接,Android調(diào)用客戶端的onServiceConnected()方法并傳遞客戶端能夠調(diào)用service。這個簡要的RPC機(jī)制介紹省略了一些細(xì)節(jié)。的信息請參照DesigningaRemoteInterfaceUsingAIDL和IBinder類的介紹。線安全方法(Thread- 這種情況主要出現(xiàn)在被調(diào)用的方法中——比如面討論的RPC機(jī)制。當(dāng)一個實現(xiàn)了IBinder對象方法的調(diào)用發(fā)生在該IBinder相同的進(jìn)里,方法在調(diào)用方的線里執(zhí)行。但是當(dāng)調(diào)用來自另外的進(jìn)時,方法將運行在Android為IBinder進(jìn)的線里選擇的一個線中,而不會運行在另外那個進(jìn)的主線中。例如,盡管一個service的onBind()方法的調(diào)用來自service進(jìn)的主線,onBind()返回的對象的實現(xiàn)的方法(比如一個實現(xiàn)了RPC方法Stub子類)會被中的線調(diào)用。因為service可以有很多客戶端,因此在同一時間可能有多個線中的線調(diào)用了IBinder方法。因此IBinder方法必須被實現(xiàn)成類似的,一個contentprovider能夠接收來自其他進(jìn)的數(shù)據(jù)請求。盡管ContentResolver和ContentProvider類隱藏了管理內(nèi)部進(jìn)間通信的細(xì)節(jié),可是響應(yīng)這些請求的ContentProvider方法—query(),insert(),delete(),update()和getType()方法—是從contentprovider進(jìn)的線中調(diào)用的,而不是從該進(jìn)的主線。因為這些方法在同一時刻可能被任意數(shù)量的線組件生命周期 序組件有生命周期——從開始Android實例化它們以響應(yīng)intent到實例被銷毀時結(jié)束。在activity組件而言,就是用activity,servicebroadcastreceiver的生命周期活動的生命周期(Activity一個activity在其上方,并且那個activity是透明的或者未覆蓋整個屏幕,因此這個暫停activityactivity依然是活動的(它保存了所有的actvity完全掩蓋時狀態(tài)為停止(stopped)。這時它仍然保存了所有的狀態(tài)和成員信息。然而,它對用戶來說不再可見,它的窗口被隱藏,并且在其他地方需要內(nèi)存的時候常常會被系統(tǒng)kill。如果一個acviy處于暫?;蛲V?fàn)顟B(tài),系統(tǒng)可以通過調(diào)用finsh()kill進(jìn)來將其從內(nèi)存中清理掉。當(dāng)它再次顯示給用戶時,就必須完全重啟并恢復(fù)到原來的狀voidvoidonCreate(BundlesavedInstanceState)voidonStart()voidonResume()voidonPause()voidonStop()實例化的時候activityonCreate()方法來做初始化工作。許多activity也實現(xiàn)onPause()來確認(rèn)數(shù)據(jù)改變并準(zhǔn)備好停止和用戶交互。調(diào)用超類(Callingintothe調(diào)用超類(Callingintotheprotectedvoid}activity的完整生命周期起始于onCreate()的的onDestroy()調(diào)用。activity通過onCreate()進(jìn)行它"global"狀態(tài)的初步建立,通過onDestroy()釋放所有剩余資源。例如,如果它onDestroy()停止該線activity的可視生命周期從一個onStart()調(diào)用開始,直到一個相對的onStop()調(diào)用。在此期間,用戶可以在屏幕上看到該activity,盡管它可能不臺并與用戶交互。在這兩個方法之間,你可以需要向用戶顯示該activity的所需資源。例如,你可以使用onStart()一個BroadcastReceiver來對你的UI有影響的變化,以及當(dāng)用戶不再能夠看到你所顯示的時候通過onStop()取消。當(dāng)activity在用戶可視和不可視間交替的時候,onStart()onStop()方法能夠被多次調(diào)用。activity的前臺生命周期開始于一個onResume()調(diào)用,終止于一個相對的onPause()調(diào)用。在此期間,該activity位于屏幕上所有其他activity的前面并與用戶交互。一個activityactivity時,onPause()activityintent時,onResume()下面的圖示說明了這些循環(huán)和一個activity在各個狀態(tài)間轉(zhuǎn)換的步驟。彩色的橢圓是activityactivity在狀態(tài)間轉(zhuǎn)換的時候,你可以實現(xiàn)的用來執(zhí)行操作activity最初建立時被調(diào)用。在這里你應(yīng)該做通常的所有靜態(tài)的常規(guī)的設(shè)定—建立view,綁定數(shù)據(jù)到列表等等。這個活動之前的狀態(tài)的Bundle對象。(參照稍后的Saving當(dāng)activityonResume();如果活動被隱藏,下一步是調(diào)onStop()?;蛟赼ctivity開始與用戶交互之前調(diào)用。此時,該activityactivityonPause()acty用于將未保存的數(shù)據(jù)保存為永久數(shù)據(jù),停止動畫和其他可能消耗Uacty才開始。activity回到前臺,下一步是activity不再對用戶可視時被調(diào)用。它可能發(fā)生在它就要被銷毀時,或者另外一個activity(無論一個既存的或是一個在activity被銷毀之前被調(diào)用。這是該activity所能接到的最節(jié)約空間將這個實例暫時銷毀時會被調(diào)用。您應(yīng)該可以Killableactivity所在進(jìn),而無需執(zhí)行該activity的其他行代碼。三個方法(onPause(),onStop()和onDestroy())法,onStop()onDestroy()可能不被調(diào)用。因此,你應(yīng)該onPause()將數(shù)據(jù)(比如用戶編Killable欄被標(biāo)明"No"的方法在被調(diào)用的時候能夠保護(hù)該activity所處進(jìn)不會被殺死。例如,從onPause()返回的時刻到onResume()被調(diào)用的時刻,一個activity處于可殺死狀態(tài)。它將不會處于可被殺死狀態(tài)直到onPause()再次返回。就如稍后章節(jié)Processesandlifecycleactivity在這個定義的時候不"可殺",但仍然可能被系統(tǒng)殺死—但也僅僅當(dāng)已經(jīng)沒有其他資源的嚴(yán)重的情況保存活動狀態(tài)(Savingactivity當(dāng)系統(tǒng)而不是用戶關(guān)閉一個activity以節(jié)省內(nèi)存,該用戶可能希望返回到該activity的時候,你可以實現(xiàn)一個activity的onSaveInstanceState()方法,從而在該activity被殺死前它的狀態(tài)。AndroidactivityonPause()被調(diào)用之前。它傳遞給該方法一個Bundle對象,那里你可以以鍵值對(name-valuepairs)方式記錄activity的動態(tài)狀態(tài)。當(dāng)該activity重啟時,該Bundle會傳遞給onCreate()和在onStart()之后調(diào)用的方法,不像面討論的onPause()和其他方法,onSaveInstanceState()和onRestoreInstanceState()不是生命周期方法。它們不是總被調(diào)用。例如,Android在該activity將被系統(tǒng)銷毀之前調(diào)用onSaveInstanceState(),但是當(dāng)該實例由于用戶操作(比如按了BACK鍵)而被銷毀前,不會activity,所以也沒有理由保留它的狀態(tài)。因為onSaveInstanceState()不是總被調(diào)用,你應(yīng)該使用它僅僅記錄該activity的短暫狀態(tài),而不是為永久性數(shù)據(jù)。那種情況應(yīng)該改用onPause()。協(xié)調(diào)活動(Coordinating當(dāng)一個activity開始了另外一個,它們都經(jīng)歷了生命周期的轉(zhuǎn)變。一個activity暫?;蛘咄V?,而另外一個activity啟動了。在這種場合,你可以需要協(xié)調(diào)這些activity。接著,被啟動的activity的onCreate(),onStart()和onResume()服務(wù)的生命周期(ServiceContext.startService()Context.stopService()停止它。它能夠通過調(diào)用Service.stopSelf()或Service.stopSelfResult()停止自己。不管調(diào)用過多少次startService(),僅僅調(diào)用一次stopService()就可以停止service。通過它定義和導(dǎo)出的接口,可以對service進(jìn)行式化操作。客戶端建立到Service對象的連接,然后使用這個連接對service進(jìn)行請求。通過調(diào)用Context.bindService()建立連如果該service還沒有被載入,bindService()能夠選擇啟動它。startService()啟動service上。例如,一對象。片刻之后,可能是用戶想通過器進(jìn)行某些控制或者取得當(dāng)前歌曲的信息時,通過調(diào)用bindService(),將一個activity建立到這個service的連接。像這樣的情況,stopService()將不會真正的停止該service,直到最后的綁定被解開。就像activity,一個service也有生命周期方法,你可以實現(xiàn)它來它的狀態(tài)的變化。但是它們比activity方法只有三個,并且它們是public的,不是protected的:voidvoidvoidonStart(Intentintent)voidonDestroy()放所有它保留的資源。例如,一個音樂器service可以通過onCreate()生成將要無論service是由Context.startService還是Context.bindService啟動的,onCreate和onDestroy()方法都會被調(diào)用。但是,onStart()servicestartService()啟動的情況下被IBinderonBind(Intentintent)booleanIBinderonBind(Intentintent)booleanonUnbind

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論