偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android應(yīng)用程序模塊詳解

移動(dòng)開發(fā) Android
本文向您介紹Android應(yīng)用程序開發(fā)中的各個(gè)模塊,包括任務(wù)、啟動(dòng)模式、進(jìn)程和線程等。

在大多數(shù)操作系統(tǒng)里,存在獨(dú)立的一個(gè)1對1的可執(zhí)行文件(如Windows里的exe文件), 它可以產(chǎn)生進(jìn)程,并能和界面圖標(biāo)、應(yīng)用進(jìn)行用戶交互。但在Android里,這是不固定的,理解將這些分散的部分如何進(jìn)行組合是非常重要的。

由于Android這種可靈活變通的,在實(shí)現(xiàn)一個(gè)應(yīng)用不同部分時(shí)你需要理解一些基礎(chǔ)技術(shù):

一個(gè)android 包 (簡稱 .apk ) ,里面包含應(yīng)用程序的代碼以及資源。這是一個(gè)應(yīng)用發(fā)布,用戶能下載并安裝他們設(shè)備上的文件。

一個(gè)任務(wù) ,通常用戶能當(dāng)它為一個(gè)“應(yīng)用程序”來啟動(dòng):通常在桌面上會(huì)有一個(gè)圖標(biāo)可以來啟動(dòng)任務(wù),這是一個(gè)上層的應(yīng)用,可以將你的任務(wù)切換到前臺(tái)來。

一個(gè)進(jìn)程 是一個(gè)底層的代碼運(yùn)行級(jí)別的核心進(jìn)程。通常.apk包里所有代碼運(yùn)行在一個(gè)進(jìn)程里,一個(gè)進(jìn)程對于一個(gè).apk包;然而, 進(jìn)程 標(biāo)簽常用來改變代碼運(yùn)行的位置,可以是 全部的.apk包 或者是獨(dú)立的 活動(dòng), 接收器, 服務(wù), 或者 提供器組件。

任務(wù)

記住關(guān)鍵的一點(diǎn):當(dāng)用戶看到的“應(yīng)用”,無論實(shí)際是如何處理的,它都是一個(gè)任務(wù)。如果你僅僅通過一些活動(dòng)來創(chuàng)建一個(gè).apk包,其中有一個(gè)肯定是上層入口(通過動(dòng)作的intent-filter 以及分類android.intent.category.LAUNCHER),然后你的.apk包就創(chuàng)建了一個(gè)單獨(dú)任務(wù),無論你啟動(dòng)哪個(gè)活動(dòng)都會(huì)是這個(gè)任務(wù)的一部分。

一個(gè)任務(wù),從使用者的觀點(diǎn),他是一個(gè)應(yīng)用程序;對開發(fā)者來講,它是貫穿活動(dòng)著任務(wù)的一個(gè)或者多個(gè)視圖,或者一個(gè)活動(dòng)棧。當(dāng)設(shè)置Intent.FLAG_ACTIVITY_NEW_TASK標(biāo)志啟動(dòng)一個(gè)活動(dòng)意圖時(shí),任務(wù)就被創(chuàng)建了;這個(gè)意圖被用作任務(wù)的根用途,定義區(qū)分哪個(gè)任務(wù)。如果活動(dòng)啟動(dòng)時(shí)沒有這個(gè)標(biāo)記將被運(yùn)行在同一個(gè)任務(wù)里(除非你的活動(dòng)以特殊模式被啟動(dòng),這個(gè)后面會(huì)討論)。如果你使用 FLAG_ACTIVITY_NEW_TASK標(biāo)記并且這個(gè)意圖的任務(wù)已經(jīng)啟動(dòng),任務(wù)將被切換到前臺(tái)而不是重新加載。

FLAG_ACTIVITY_NEW_TASK必須小心使用:在用戶看來,一個(gè)新的應(yīng)用程序由此啟動(dòng)。如果這不是你期望的,你想要?jiǎng)?chuàng)建一個(gè)新的任務(wù)。另外,如果用戶需要從桌面退出到他原來的地方然后使用同樣的意圖打開一個(gè)新的任務(wù),你需要使用新的任務(wù)標(biāo)記。否則,如果用戶在你剛啟動(dòng)的任務(wù)里按桌面(HOME)鍵,而不是退出(BACK)鍵,你的任務(wù)以及任務(wù)的活動(dòng)將被放在桌面程序的后面,沒有辦法再切換過去。

任務(wù)親和力(Affinities)

一些情況下Android需要知道哪個(gè)任務(wù)的活動(dòng)附屬于一個(gè)特殊的任務(wù),即使該任務(wù)還沒有被啟動(dòng)。這通過任務(wù)親和力來完成,它為任務(wù)中一個(gè)或多個(gè)可能要運(yùn)行的活動(dòng)提供一個(gè)獨(dú)一無二的靜態(tài)名字。默認(rèn)為活動(dòng)命名的任務(wù)親和力的名字,就是實(shí)現(xiàn)該活動(dòng).apk包的名字。這提供一種通用的特性,對用戶來說,所有在.apk包里的活動(dòng)都是單一應(yīng)用的一部分。

當(dāng)不帶 Intent.FLAG_ACTIVITY_NEW_TASK 標(biāo)記啟動(dòng)一個(gè)新的活動(dòng),任務(wù)親和力對新啟動(dòng)的活動(dòng)將沒有影響作用:它將一直運(yùn)行在它啟動(dòng)的那個(gè)任務(wù)里。然而,如果使用NEW_TASK標(biāo)記,親和力會(huì)檢測已經(jīng)存在的任務(wù)是否具有相同的親和力。如果是,該任務(wù)會(huì)被切換到前臺(tái),新的活動(dòng)會(huì)在任務(wù)的最上面被啟動(dòng)。

你可以在你的表現(xiàn)文件里的應(yīng)用程序標(biāo)簽里為.apk包里所有的活動(dòng)設(shè)置你自己的任務(wù)親和力,當(dāng)然也可以為單獨(dú)的活動(dòng)設(shè)置標(biāo)簽。這里有些例子演示如何使用:

如果你的.apk包里包含多個(gè)用戶可啟動(dòng)的上層應(yīng)用程序,那么你可能想要為每個(gè)活動(dòng)分配不同的親和力。這里有一個(gè)不錯(cuò)的協(xié)定,你可以將不同的名字字串加上冒號(hào)附加在.apk包名字的后面 。 例如,"com.android.contacts"的親和力命名可以是"com.android.contacts:Dialer" and "com.android.contacts:ContactsList"。 

如果你想替換一個(gè)通知,快捷鍵,或者其它能從外部啟動(dòng)的應(yīng)用程序的內(nèi)部活動(dòng),你需要在你想替換的活動(dòng)里明確的設(shè)置任務(wù)親和力(taskAffinity)。例如,如果你想替換聯(lián)系人詳細(xì)信息瀏覽界面(用戶可以直接操作或者通過快捷方式調(diào)用),你需要設(shè)置任務(wù)親和力(taskAffinity)為“com.android.contacts”。 

啟動(dòng)模式以及啟動(dòng)標(biāo)記

你控制活動(dòng)和任務(wù)通信的最主要的方法是通過設(shè)置啟動(dòng)模式的屬性以及意圖相應(yīng)的標(biāo)記。這兩個(gè)參數(shù)能以不同的組合來共同控制活動(dòng)的啟動(dòng)結(jié)果,這在相應(yīng)的文檔里有描述。這里我們只描述一些通用的用法以及幾種不同的組合方式。

你最通常使用的模式是singleTop(除了默認(rèn)為standard模式)。這不會(huì)對任務(wù)產(chǎn)生什么影響;僅僅是防止在棧頂多次啟動(dòng)同一個(gè)活動(dòng)。 

singleTask模式對任務(wù)有一些影響:它能使得活動(dòng)總是在新的任務(wù)里被打開(或者將已經(jīng)打開的任務(wù)切換到前臺(tái)來)。使用這個(gè)模式需要加倍小心該進(jìn)程是如何和系統(tǒng)其他部分交互的,它可能影響所有的活動(dòng)。這個(gè)模式最好被用于應(yīng)用程序入口活動(dòng)的標(biāo)記中。(支持MAIN活動(dòng)和LAUNCHER分類)。

singleInstance啟動(dòng)模式更加特殊,該模式只能當(dāng)整個(gè)應(yīng)用只有一個(gè)活動(dòng)時(shí)使用。

有一種情況你會(huì)經(jīng)常遇到,其它實(shí)體(如搜索管理器SearchManager 或者 通知管理器NotificationManager)會(huì)啟動(dòng)你的活動(dòng)。這種情況下,你需要使用 Intent.FLAG_ACTIVITY_NEW_TASK 標(biāo)記,因?yàn)榛顒?dòng)在任務(wù)(這個(gè)應(yīng)用/任務(wù)還沒有被啟動(dòng))之外被啟動(dòng)。就像之前描述的一樣, 這種情況下標(biāo)準(zhǔn)特性就是當(dāng)前和任務(wù)和新的活動(dòng)的親和性匹配的任務(wù)將會(huì)切換到前臺(tái),然后在最頂端啟動(dòng)一個(gè)新的活動(dòng)。當(dāng)然,你也可以實(shí)現(xiàn)其它類型的特性。

一個(gè)常用的做法就是將Intent.FLAG_ACTIVITY_CLEAR_TOP 和NEW_TASK一起使用。這樣做,如果你的任務(wù)已經(jīng)處于運(yùn)行中,任務(wù)將會(huì)被切換到前臺(tái)來, 在棧里的所有的活動(dòng)除了根活動(dòng),都將被清空,根活動(dòng)的onNewIntent(Intent) 方法傳入意圖參數(shù)后被調(diào)用。當(dāng)使用這種方法的時(shí)候 singleTop 或者 singleTask啟動(dòng)模式經(jīng)常被使用,這樣當(dāng)前實(shí)例會(huì)被置入一個(gè)新的意圖,而不是銷毀原先的任務(wù)然后啟動(dòng)一個(gè)新的實(shí)例。

另外你可以使用的一個(gè)方法是設(shè)置活動(dòng)的任務(wù)親和力為空字串(表示沒有親和力),然后設(shè)置finishOnBackground屬性。 如果你想讓用戶給你提供一個(gè)單獨(dú)的活動(dòng)描述的通知,倒不如返回到應(yīng)用的任務(wù)里,這個(gè)比較管用。要指定這個(gè)屬性,不管用戶使用BACK還是HOME,活動(dòng)都會(huì)結(jié)束;如果這個(gè)屬性沒有指定,按HOME鍵將會(huì)導(dǎo)致活動(dòng)以及任務(wù)還留在系統(tǒng)里,并且沒有辦法返回到該任務(wù)里。 

進(jìn)程

在Android中,進(jìn)程是應(yīng)用程序的完整實(shí)現(xiàn),而不是用戶通常了解的那樣。他們主要用途很簡單:

◆提高穩(wěn)定性和安全性,將不信任或者不穩(wěn)定的代碼移動(dòng)到其他進(jìn)程。 
◆可將多個(gè).apk包運(yùn)行在同一個(gè)進(jìn)程里減少系統(tǒng)開銷。 
◆幫助系統(tǒng)管理資源,將重要的代碼放在一個(gè)單獨(dú)的進(jìn)程里,這樣就可以單獨(dú)銷毀應(yīng)用程序的其他部分。 

像前面描述的一樣,進(jìn)程的屬性被用來控制那些有特殊應(yīng)用組件運(yùn)行的進(jìn)程。注意這個(gè)屬性不能違反系統(tǒng)安全: 如果兩個(gè).apk包不能共享同一個(gè)用戶ID,卻試圖運(yùn)行在通一個(gè)進(jìn)程里,這種情況是不被允許的,事實(shí)上系統(tǒng)將會(huì)創(chuàng)建兩個(gè)不同的進(jìn)程。

線程

每個(gè)進(jìn)程包含一個(gè)或多個(gè)線程。多數(shù)情況下,Android 避免在進(jìn)程里創(chuàng)建多余的線程,除非它創(chuàng)建它自己的線程,我們應(yīng)保持應(yīng)用程序的單線程性。 一個(gè)重要的結(jié)論就是所有呼叫實(shí)例, 廣播接收器, 以及 服務(wù)的實(shí)例都是由這個(gè)進(jìn)程里運(yùn)行的主線程創(chuàng)建的。

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

這里有一些關(guān)于創(chuàng)建線程規(guī)則的例外:

呼叫IBinder或者IBinder實(shí)現(xiàn)的接口,如果該呼叫來自其他進(jìn)程,你可以通過線程發(fā)送的IBinder或者本地進(jìn)程中的線程池呼叫它們,從進(jìn)程的主線程呼叫是不可以的。特殊情況下,,呼叫一個(gè)服務(wù) 的IBinder可以這樣處理。(雖然在服務(wù)里呼叫方法在主線程里已經(jīng)完成。)這意味著IBinder接口的實(shí)現(xiàn)必須要有一種線程安全的方法,這樣任意線程才能同時(shí)訪問它。

呼叫由正在被調(diào)用的線程或者主線程以及IBinder派發(fā)的內(nèi)容提供器 的主方法。被指定的方法在內(nèi)容提供器的類里有記錄。這意味著實(shí)現(xiàn)這些方法必須要有一種線程安全的模式,這樣任意其它線程同時(shí)可以訪問它。

呼叫視圖以及由視圖里正在運(yùn)行的線程組成的子類。通常情況下,這會(huì)被作為進(jìn)程的主線程,如果你創(chuàng)建一個(gè)線程并顯示一個(gè)窗口,那么繼承的窗口視圖將從那個(gè)線程里啟動(dòng)。 

【編輯推薦】

  1. 怎樣使用Eclipse來開發(fā)Android源碼 
  2. 開發(fā)者眼中的Moblin和Android 
  3. Acer宣布啟動(dòng)Android開發(fā)進(jìn)程 
  4. Google將推Android 1.5 包含新的APIs 
  5. Android平臺(tái)應(yīng)用開發(fā)實(shí)例:Notepad
責(zé)任編輯:佚名 來源: chinaup
相關(guān)推薦

2009-09-22 09:42:24

Scala的核心

2010-01-04 10:41:14

Silverlight

2011-08-10 11:25:59

ipad信息架構(gòu)數(shù)據(jù)結(jié)構(gòu)

2009-07-23 13:26:21

2010-08-02 09:10:36

Flex模塊化

2013-07-25 15:05:00

Android模擬器Genymotion

2011-07-26 09:41:23

iPhone xcode Mac OS X

2011-07-28 15:47:20

IOS 程序 測試

2011-07-19 14:36:32

iPhone

2010-01-25 13:29:53

Android本地應(yīng)用

2011-11-03 09:41:35

Android簽名安全性

2010-10-08 09:03:51

2023-12-10 14:43:30

PythonGUIeel

2010-02-04 10:17:38

Android應(yīng)用程序

2011-05-10 13:56:27

Android應(yīng)用程序Android MarAndroid

2010-02-05 18:21:24

Android應(yīng)用程序

2011-05-27 10:13:39

Android 簽名

2010-03-02 14:24:00

Android應(yīng)用程序

2010-02-07 10:25:11

Android

2017-03-02 11:10:39

AndroidMVVM應(yīng)用程序
點(diǎn)贊
收藏

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