欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android應(yīng)用程序模型之應(yīng)用程序,任務(wù),進(jìn)程,線程分析

 更新時間:2016年01月11日 11:28:12   作者:Leo Chin  
這篇文章主要介紹了Android應(yīng)用程序模型之應(yīng)用程序,任務(wù),進(jìn)程,線程分析,較為詳細(xì)的分析了Android應(yīng)用程序模型中關(guān)于任務(wù)、進(jìn)程、線程的相關(guān)概念及注意事項(xiàng),需要的朋友可以參考下

本文講述了Android應(yīng)用程序模型之應(yīng)用程序,任務(wù),進(jìn)程,線程。分享給大家供大家參考,具體如下:

大多數(shù)操作系統(tǒng),在應(yīng)用程序所寄存的可執(zhí)行程序映像(如Windows系統(tǒng)里的.exe)、它所運(yùn)行的進(jìn)程以及和用戶交互的圖標(biāo)和應(yīng)用之間有一種嚴(yán)格的1對1關(guān)系。在Android系統(tǒng)里,這些關(guān)聯(lián)要松散得多。并且重要的是要理解各種概念怎么樣組成整體。

由于Android應(yīng)用固有的靈活性,當(dāng)實(shí)現(xiàn)這些不同方面的時候有一些基本術(shù)語需要加以理解:

① 一個Android包 (.apk)文件,其中包含一個應(yīng)用程序的代碼和資源。這是應(yīng)用程序分發(fā)和下載的文件,用戶用來安裝該應(yīng)用程序在他們的設(shè)備上。
② 一個任務(wù)一般而言是指用戶視為的一個可啟動應(yīng)用程序:通常任務(wù)在桌面(home screen)有一個可訪問的圖標(biāo),且可以被切換到前臺。
③ 一個進(jìn)程是一個運(yùn)行著應(yīng)用程序代碼的底層核心過程。通常所有.apk里的代碼運(yùn)行在一個專有的進(jìn)程里。不過,進(jìn)程標(biāo)記也可以用來限定代碼運(yùn)行位置,或者為整個.apk或者為個別的活動activity,接收者receiver,服務(wù)或提供者provider,組件。

任務(wù)

這里的一個關(guān)鍵點(diǎn)是:當(dāng)用戶看到一個“應(yīng)用”時,他們實(shí)際上在和任務(wù)打交道。如果您剛剛創(chuàng)建一個包含若干活動的.apk,其中之一是頂層入口點(diǎn)(通過動作android.intent.action.MAIN的意圖過濾器intent-filter和類別android.intent.category.LAUNCHER),那么這事實(shí)上將為您的.apk創(chuàng)建一個任務(wù),并且您從那兒起動的任何活動都將作為那個任務(wù)的一部分運(yùn)行。

一個任務(wù),那么,從用戶的角度來看是您的應(yīng)用程序;而從應(yīng)用程序開發(fā)者的角度來看,它是一個或多個用戶在那個任務(wù)中已經(jīng)經(jīng)歷過且未關(guān)閉的活動,或者說是一個活動棧。一個新的任務(wù)通過以Intent.FLAG_ACTIVITY_NEW_TASK標(biāo)志起動一個活動意圖來創(chuàng)建;這一意圖將被用來作為任務(wù)的根意圖,定義任務(wù)是什么。任何不以這個標(biāo)志起動的活動將和起動它的活動在相同的任務(wù)中運(yùn)行(除非該活動已請求特別啟動模式,稍后會討論)。任務(wù)可以被重新安排:如果您使用FLAG_ACTIVITY_NEW_TASK標(biāo)志但已經(jīng)有一個任務(wù)以這個意圖運(yùn)行,則當(dāng)前任務(wù)的活動棧將被切換到前臺而不是開始一個新的任務(wù)。

FLAG_ACTIVITY_NEW_TASK必 須謹(jǐn)慎使用:使用它意味著,在用戶看來,一個新的應(yīng)用程序由此起動。如果這不是你所期望的行為,你就不該去創(chuàng)建一個新的任務(wù)。另外,僅在用戶可以從桌面返 回到他原來的地方和以一個新任務(wù)啟動相同意圖的情況下,你才應(yīng)該使用新的任務(wù)標(biāo)記。否則,如果用戶在你已經(jīng)啟動的任務(wù)里按桌面(HOME)鍵,而不是返回(BACK)鍵,你的任務(wù)及其活動將被放置到桌面后面,沒有辦法再切換回去。

任務(wù)共用性Affinity

在某些情況下,Android需要知道一個活動屬于哪個任務(wù)即使它沒有被啟動到一個具體的任務(wù)里。這是通過任務(wù)共用性(Affinities)完成的。任務(wù)共用性(Affinities)為這個運(yùn)行一個或多個活動的任務(wù)提供了一個獨(dú)特的靜態(tài)名稱,默認(rèn)的一個活動的任務(wù)共用性(Affinity)是實(shí)現(xiàn)了該活動的.apk包的名字。這提供了預(yù)期的標(biāo)準(zhǔn)特性,即所有在一個特定的.apk包里的活動是單個用戶應(yīng)用程序的一部分。

當(dāng)開始一個沒有Intent.FLAG_ACTIVITY_NEW_TASK標(biāo)志的活動時,任務(wù)共用性affinities不會影響將會運(yùn)行該新活動的任務(wù):它總是運(yùn)行在啟動它的任務(wù)里。但是,如果使用了NEW_TASK標(biāo)志,那么共用性(affinity)將被用來判斷是否已經(jīng)存在一個有相同共用性(affinity)的任務(wù)。如果是這樣,這項(xiàng)任務(wù)將被切換到前面而新的活動會啟動于這個任務(wù)的頂層。

這種特性在您必須使用NEW_TASK標(biāo)志的情況下最有用,尤其是從狀態(tài)欄通知或桌面快捷方式啟動活動時。結(jié)果是,當(dāng)用戶用這種方式啟動您的應(yīng)用程序時,它的當(dāng)前任務(wù)將被切換到前臺,而且想要查看的活動被放在最上面。

你可以在程序清單(Manifest)文件的應(yīng)用程序application標(biāo)簽中為.apk包中所有的活動分配你自己的任務(wù)共用性Affinites,或者在活動標(biāo)記中為各個活動進(jìn)行分配。一些說明其如何使用的例子如下:

① 如果您的.apk包含多個用戶可以啟動的高層應(yīng)用程序,那么您可能需要對用戶看到的每個活動指定不同的affinities。一個不錯的命名慣例是以附加一個以冒號分隔的字符串來擴(kuò)展您的.apk包名。例如,“ com.android.contacts ”.apk可以有affinities:“com.android.contacts:Dialer”和“ com.android.contacts:ContactsList”。
② 如果您正在替換一個通知,快捷方式,或其他可以從外部發(fā)起的應(yīng)用程序的“內(nèi)部”活動,你可能需要明確設(shè)定您替代活動的taskAffinity和您準(zhǔn)備替代的應(yīng)用程序一樣。例如,如果您想替換contacts詳細(xì)信息視圖(用戶可以創(chuàng)建并調(diào)用快捷方式),你得把taskAffinity設(shè)置成“com.android.contacts”。

啟動模式和啟動標(biāo)志

您控制活動和任務(wù)交互的主要途徑是通過活動的launchMode 屬性和意圖相關(guān)的標(biāo)志flags。這兩個參數(shù)可以以各種方式合作來控制活動啟動的結(jié)果,正如它們相關(guān)文檔中描述的那樣。在這里,我們將看看一些常見的用例和參數(shù)組合。

你將使用的最常見的啟動模式(除了默認(rèn)的standard模式)是singleTop。這并不影響任務(wù);它只是避免多次在一個堆棧頂部起動同一活動。

singleTask啟動模式對任務(wù)有重大的影響:它使活動始終是開始于一項(xiàng)新的任務(wù)(或其現(xiàn)有的任務(wù)被帶到前臺) 。使用這種模式需要謹(jǐn)慎對待你如何與系統(tǒng)其他部分進(jìn)行交互,因?yàn)檫@影響到這個活動中的每一個路徑。它應(yīng)當(dāng)僅在活動處于應(yīng)用程序前臺時使用(也就是支持MAIN動作和LAUNCHER類別)。

singleInstance啟動模式更是專業(yè),并應(yīng)僅用于整個就是被實(shí)現(xiàn)為一個活動的應(yīng)用程序中。

有一種你會經(jīng)常遇到的情況是當(dāng)另一個實(shí)體(如SearchManager 或NotificationManager)開始您的一個活動。在這種情況下,必須使用Intent.FLAG_ACTIVITY_NEW_TASK 標(biāo)簽,因?yàn)樵擁?xiàng)活動是在任務(wù)之外起動的(而且應(yīng)用/任務(wù)可能根本不存在)。正如前面所述,這種情況下的標(biāo)準(zhǔn)行為是把匹配新活動affinity的任務(wù)帶到前臺和在此之上起動新的活動。不過,也有其他您可以實(shí)施的行為類型。

一種通常的辦法是和NEW_TASK聯(lián)合起來使用Intent.FLAG_ACTIVITY_CLEAR_TOP標(biāo)志。這樣,如果您的任務(wù)已經(jīng)運(yùn)行,那么它將會被帶到前臺,除根活動外其它所有堆棧中的活動都被清除,而且這個根活動的方法onNewIntent(Intent)會在該意圖起動時被調(diào)用。注意這個活動使用這個方法時經(jīng)常使用singleTop或者singleTask起動模式,這樣當(dāng)前實(shí)例被賦予新的意圖而不是需要銷毀它然后重新起動一個新的實(shí)例。

您能采取的另外的方法是設(shè)置通知活動的任務(wù)affinity為空字符串“”(表示沒有affinity),并設(shè)置finishOnBackground屬性。這種方法是有用的如果你希望這個通知把用戶帶到一個單獨(dú)的描述它的活動中,而不是返回到應(yīng)用程序的任務(wù)。通過指定這個屬性,該活動將被結(jié)束不管用戶通過BACK還是HOME離開它;如果這個屬性沒有指定,按首頁將導(dǎo)致這個活動及其任務(wù)仍保留在系統(tǒng)里,且可能沒有辦法返回它。

請務(wù)必閱讀關(guān)于launchMode屬性和Intent標(biāo)志的文檔以獲取這些選項(xiàng)的詳細(xì)說明。

進(jìn)程

在Android里,進(jìn)程完全是應(yīng)用的實(shí)現(xiàn)細(xì)節(jié),而不是用戶通常了解的那樣。其主要用途就是:

① 通過安置不受信任的或不穩(wěn)定的代碼到另一個進(jìn)程來提高穩(wěn)定性或安全性。
② 通過在同一進(jìn)程里運(yùn)行多個.apks的代碼來減少開銷。
③ 通過把重量級代碼放在單獨(dú)的進(jìn)程中來幫助系統(tǒng)管理資源,該進(jìn)程可以在不影響應(yīng)用程序其他部分的情況下被終止。

正如前面所述,這個進(jìn)程屬性用來控制運(yùn)行著特定應(yīng)用程序組件的進(jìn)程,注意,此屬性不能用于違反系統(tǒng)安全性:如果有兩個不共享相同用戶ID的.apks嘗試運(yùn)行在同一進(jìn)程中,這將不會被允許,相反會為它們每一個創(chuàng)建不同的進(jìn)程。

參見安全文檔以獲取更多關(guān)于安全限制方面的信息。

線程

每個進(jìn)程包含一個或多個線程。多數(shù)情況下,Android避免在進(jìn)程里創(chuàng)建額外的線程,以保持應(yīng)用程序單線程,除非它創(chuàng)建自己的線程。一個重要的結(jié)果就是所有對活動Activity,廣播接收器BroadcastReceiver以及服務(wù)Service實(shí)例的調(diào)用都是由這個進(jìn)程的主線程創(chuàng)建的。

注意新的線程并不會為每個活動,廣播接收器,服務(wù)或者內(nèi)容提供器(ContentProvider) 實(shí)例而創(chuàng)建:這些應(yīng)用程序的組件在進(jìn)程里被實(shí)例化(除非另有說明,都在同一個進(jìn)程處理),實(shí)際上是進(jìn)程的主線程。這說明當(dāng)被系統(tǒng)調(diào)用時沒有哪個組件(包括 服務(wù))會進(jìn)行遠(yuǎn)程或者阻塞操作(就像網(wǎng)絡(luò)調(diào)用或者計(jì)算循環(huán)),因?yàn)檫@將阻止進(jìn)程中的所有其他組件。你可以使用標(biāo)準(zhǔn)的線程類Thread或者Android的HandlerThread便捷類去對其它線程執(zhí)行遠(yuǎn)程操作。

這里有一些關(guān)于這個線程規(guī)則的重要的例外:

① 對IBinder或者IBinder實(shí)現(xiàn)的接口的調(diào)用由調(diào)用線程或本地進(jìn)程的線程池(如果該呼叫來自其他進(jìn)程)分發(fā),而不是它們的進(jìn)程的主線程。特殊情況下,一個服務(wù)的IBinder可以這樣調(diào)用。(盡管調(diào)用服務(wù)里的方法已經(jīng)在主線程里完成。)這意味著IBinder接口的實(shí)現(xiàn)必須要有一種線程安全的方法,這樣任意線程才能同時訪問它。
② 對ContentProvider主要方法的調(diào)用由調(diào)用線程或者主線程分發(fā),如同IBinder一樣。被指定的方法在內(nèi)容提供器的類里有記錄。這意味著實(shí)現(xiàn)這些方法必須要有一種線程安全的模式,這樣任意其它線程可以同時訪問它。
③ 視圖及其子類中的調(diào)用由正在運(yùn)行著視圖的線程產(chǎn)生。通常情況下,這會被作為進(jìn)程的主線程,如果你創(chuàng)建一個線程并顯示一個窗口,那么繼承的窗口視圖將從那個線程里啟動。

希望本文所述對大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評論