安卓Application Fundamentals

本文譯自android.com中Develop->API Guides->Application Fundamentals一節(jié)。


安卓應(yīng)用使用java語(yǔ)言編寫。安卓的開發(fā)工具將你的代碼(包括所有的數(shù)據(jù)和資源文件)編譯成一個(gè)apk,這是一個(gè)后綴名為.apk壓縮包。一個(gè)apk文件包括了一個(gè)安卓應(yīng)用的所有內(nèi)容,并且安卓系統(tǒng)設(shè)備使用這種apk文件安裝應(yīng)用程序。


一旦應(yīng)用被安裝到設(shè)備上,每一個(gè)應(yīng)用程序都會(huì)運(yùn)行在自己獨(dú)有的安全沙箱中:

1、安卓操作系統(tǒng)是一個(gè)基于Linux的多用戶系統(tǒng),每一個(gè)應(yīng)用都是一個(gè)獨(dú)立的進(jìn)程。

2、默認(rèn)的情況下,系統(tǒng)會(huì)為每個(gè)應(yīng)用分配一個(gè)獨(dú)立的用戶id(這個(gè)id僅被系統(tǒng)持有,對(duì)程序自身是透明的)。系統(tǒng)為應(yīng)用中的文件設(shè)置訪問(wèn)權(quán)限因此只有相對(duì)應(yīng)的用戶id才能夠訪問(wèn)應(yīng)用的文件。

3、每一個(gè)進(jìn)程都會(huì)有自己獨(dú)立的虛擬機(jī),所有每一個(gè)應(yīng)用都是獨(dú)立運(yùn)行,與其他應(yīng)用之間是隔離的。

4、默認(rèn)的情況下,每一個(gè)應(yīng)用都運(yùn)行在自己獨(dú)立的進(jìn)程中。當(dāng)應(yīng)用的組件被啟動(dòng)的時(shí)候,安卓會(huì)開啟一個(gè)進(jìn)程,并且當(dāng)當(dāng)進(jìn)程不再被使用或者系統(tǒng)需要為其他應(yīng)用分配足夠的內(nèi)存的時(shí)候,就會(huì)關(guān)閉這個(gè)線程。

通過(guò)這樣的方式,安卓系統(tǒng)實(shí)現(xiàn)了最小權(quán)限的原則。在默認(rèn)的情況下,每一個(gè)應(yīng)用都僅有完成自己工作的權(quán)限。通過(guò)這樣的方法確保一個(gè)非常安全大體系,確保每個(gè)應(yīng)用在沒有賦予權(quán)限的情況下不能訪問(wèn)系統(tǒng)的其他部分。

盡管這樣,安卓應(yīng)用仍然有很多的方法與其他應(yīng)用共享數(shù)據(jù)以及訪問(wèn)系統(tǒng)的服務(wù):

1、兩個(gè)應(yīng)用之間能夠共享同一個(gè)用戶id,因此他們之間能夠互相訪問(wèn)各自的文件。為了節(jié)約系統(tǒng)的資源,擁有共同的用戶ID的應(yīng)用還可以運(yùn)行在同一個(gè)進(jìn)程之中并且使用同一個(gè)虛擬機(jī)(這種情況下應(yīng)用之間 必須使用相同的簽名證書)

2、每一個(gè)應(yīng)用可以請(qǐng)求訪問(wèn)設(shè)備數(shù)據(jù)的權(quán)限,包括用戶的通訊錄、短信、數(shù)據(jù)存儲(chǔ)系統(tǒng)、相機(jī)、藍(lán)牙以及其他。應(yīng)用的權(quán)限需要在安裝的時(shí)候由用戶確認(rèn)。

應(yīng)用組件(App Components)

應(yīng)用組件是安卓應(yīng)用的基本要素。每一個(gè)組件都是系統(tǒng)進(jìn)入程序的地方。并不是所有的組件都是用戶進(jìn)入口,有的組件依賴于其他組件,有的組件獨(dú)立存在并起著特別的作用,每一個(gè)組件都是幫助構(gòu)建的應(yīng)用綜合功能的獨(dú)有部分。

有四種不同類型的組件。每一個(gè)組件都有著不同的作用和目的并且有自己生命周期。

Activities

每一個(gè)activity代表著一個(gè)擁有用戶界面的屏幕。比如,一個(gè)郵件的程序可以有一個(gè)activity展示一系列的新郵件,另一個(gè)activity用于寫郵件,還有一個(gè)actvity用于讀郵件。盡管這些activity一起構(gòu)成了一個(gè)郵件應(yīng)用的使用,但是每個(gè)activity之間是相互獨(dú)立的。此外,不同的程序也可以啟動(dòng)其他應(yīng)用的activity(只要目的應(yīng)用允許)。比如,一個(gè)相機(jī)應(yīng)用可以在郵件的應(yīng)用中被啟動(dòng)。

一個(gè)activity是作為Activity的子類實(shí)現(xiàn)。


Services

服務(wù)是為了實(shí)現(xiàn)耗時(shí)操作或者遠(yuǎn)程操作而運(yùn)行在后臺(tái)的組件。服務(wù)并沒有提供用戶的界面。比如,服務(wù)可以用于在后臺(tái)播放音樂當(dāng)用戶正在其他應(yīng)用界面的時(shí)候,或者在不阻塞用戶界面的情況下獲取網(wǎng)絡(luò)數(shù)據(jù)。activity可以啟動(dòng)一個(gè)服務(wù),或者綁定一個(gè)服務(wù)并與之進(jìn)行通訊。

一個(gè)服務(wù)作為Services的子類實(shí)現(xiàn)。


Content providers

content provider用于管理共享的應(yīng)用數(shù)據(jù)。用戶可以將數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)中、sqllite數(shù)據(jù)庫(kù)中、網(wǎng)絡(luò)上或者任何應(yīng)用程序可以訪問(wèn)的持久化存儲(chǔ)系統(tǒng)。通過(guò)content provider可以查詢甚至修改這些數(shù)據(jù)(如果content provider允許的話)。比如,安卓系統(tǒng)提供了content provider管理用戶的聯(lián)系人信息。因此具備合適權(quán)限的應(yīng)用都可以查詢部分的content provider對(duì)某個(gè)人的信息進(jìn)行讀寫。

content provider對(duì)于讀寫應(yīng)用內(nèi)部不共享的數(shù)據(jù)也一樣的有效。比如便簽應(yīng)用使用content provider保存便簽。

content provider作為的Content providers子類實(shí)現(xiàn),并且必須實(shí)現(xiàn)一套標(biāo)準(zhǔn)的api方法才能確保與其他 應(yīng)用進(jìn)行數(shù)據(jù)的交換。


Broadcast receivers

broadcast receiver是一個(gè)用于響應(yīng)系統(tǒng)廣播的組件。很多廣播來(lái)源于系統(tǒng)。比圖通知屏幕方向轉(zhuǎn)變的廣播、截圖的廣播。應(yīng)用程序也可以發(fā)送廣播,比如讓其他應(yīng)用程序知道一些文件已經(jīng)下載到設(shè)備上并且可以使用。盡管broadcast receiver并沒有用戶界面,但是他們可以發(fā)出一個(gè)狀態(tài)欄通知告知用戶廣播事件的發(fā)生。通常情況下,broadcast receiver只是扮演著其他組件的大門的角色,只是用于處理輕量級(jí)的工作。比如,它可以初始化一個(gè)服務(wù)用于完成基于該事件的工作。

broadcast receiver作為Broadcast receivers的子類實(shí)現(xiàn),并且每一個(gè)廣播傳播一個(gè)intent對(duì)象。


作為安卓系統(tǒng)設(shè)計(jì)的獨(dú)特的一面,一個(gè)應(yīng)用可以啟動(dòng)另一個(gè)應(yīng)用的組件。比如,如果你想用設(shè)備的相機(jī)拍一張照片,很可能的情況是,有另一個(gè)應(yīng)用實(shí)現(xiàn)了(拍照)這個(gè)功能,而你的應(yīng)用可以直接使用它,而不是在你的應(yīng)用中開發(fā)一個(gè)新的activity用于拍照。你并不需要合并或者連接到相機(jī)應(yīng)用的代碼。你可以簡(jiǎn)單的啟動(dòng)相機(jī)里面的activity去完成拍照的動(dòng)作。并且拍完的時(shí)候,照片會(huì)返回到你的應(yīng)用并且你可以使用它。對(duì)于用戶而言,這就像是相機(jī)應(yīng)用是你應(yīng)用中的一部分。

當(dāng)系統(tǒng)啟動(dòng)一個(gè)組件的時(shí)候,系統(tǒng)會(huì)為應(yīng)用啟動(dòng)一個(gè)進(jìn)程(進(jìn)程還沒有啟動(dòng)的話)并實(shí)例化組件所需要的類。比如,如果你的應(yīng)用啟動(dòng)了相機(jī)應(yīng)用里面的activity去拍攝照片,那個(gè)被啟動(dòng)的activity會(huì)運(yùn)行在屬于相機(jī)應(yīng)用的進(jìn)程,而并不是你的應(yīng)用的進(jìn)程。因此,不像大多數(shù)系統(tǒng)的應(yīng)用,安卓的應(yīng)用并沒有一個(gè)單一的入口。

因?yàn)橄到y(tǒng)將每個(gè)應(yīng)用運(yùn)行在獨(dú)立的帶有文件權(quán)限的進(jìn)程中,你的應(yīng)用不可以直接激活其他應(yīng)用的組件。然而,系統(tǒng)本身可以。因此,為了激活其他應(yīng)用的組件,你必須發(fā)送一個(gè)指明了你要啟動(dòng)的組件的意圖信息給系統(tǒng)。并由系統(tǒng)為你激活相應(yīng)的組件。

Activating Components

有三種組件(activity、service、broadcast receiver)是被一種稱之為意圖(intent)的異步消息激活的。意圖在運(yùn)行期間綁定組件(你可以把這些意圖對(duì)象理解成是那些等待著命令的送信人),不管這些組件是屬于你的應(yīng)用還是其他的。

一個(gè)意圖是由意圖對(duì)象產(chǎn)生的,它定義了一個(gè)激活明確的組件或者是某一類組件的消息——意圖可以是顯式的也可以是隱式的。

對(duì)于activity和service,一個(gè)意圖定義了一個(gè)執(zhí)行的動(dòng)作(比如,顯示或者是發(fā)送一些東西),也有可能指定了需要展示的數(shù)據(jù)的uri(以及是其他啟動(dòng)組件需要知道的東西)。比如,一個(gè)意圖可以傳達(dá)一個(gè)展示圖片或者打開一個(gè)網(wǎng)頁(yè)的需求。在某些情況下,你可以啟動(dòng)一個(gè)activity接收一個(gè)結(jié)果;也有的情況,activity會(huì)通過(guò)intent返回結(jié)果(比如,你可以分發(fā)一個(gè)意圖讓用戶選擇一個(gè)聯(lián)系人并且讓它返回給你——返回的intent包含了指向選擇的聯(lián)系人的uri)

對(duì)于broadcast receiver,意圖只是簡(jiǎn)單定義了需要被廣播的通知()

至于content provider并不是由意圖來(lái)激活的。一個(gè)來(lái)自于ContentResolver的需求指向某個(gè)content provider的時(shí)候,它才會(huì)被激活。The content resolver handles all direct transactions with the content provider so that the component that's performing transactions with the provider doesn't need to and instead calls methods on theContentResolverobject. This leaves a layer of abstraction between the content provider and the component requesting information (for security).

有各種不同的方法用于激活各種類型的組件:

1、你可以啟動(dòng)一個(gè)activity通過(guò)傳遞一個(gè)意圖到方法startActivity()或者是startActivityForResult()(當(dāng)你希望啟動(dòng)的activity能夠返回一個(gè)結(jié)果的時(shí)候)

2、你可以開啟一個(gè)service通過(guò)傳遞一個(gè)意圖到方法startService()?;蛘吣憧梢越壎ㄒ粋€(gè)service通過(guò) 傳遞意圖到方法bindService()。

3、你可以實(shí)例化一個(gè)廣播通過(guò)傳遞一個(gè)意圖到這些方法:sendBroadcast(),sendOrderedBroadcast(), orsendStickyBroadcast().

4、你可以在一個(gè)ContentResolver對(duì)象調(diào)用query()方法查詢一個(gè)content provider。

The Manifest File

在安卓系統(tǒng)啟動(dòng)一個(gè)應(yīng)用組件之前,系統(tǒng)必須可以通過(guò)閱讀應(yīng)用的AndroidManifest.xml配置文件明確組件的存在。你的應(yīng)用必須在這個(gè)文件里面聲明所有的組件,并且這個(gè)文件必須在整改應(yīng)用目錄結(jié)構(gòu)的根目錄。

這個(gè)配置文件除了聲明組件之外還做了一系列的事情,比如:

1、指出應(yīng)用所需要的全部權(quán)限,比如訪問(wèn)網(wǎng)絡(luò)、讀取用戶聯(lián)系人信息的權(quán)限;

2、聲明應(yīng)用最低的api級(jí)別,應(yīng)用基于哪一個(gè)級(jí)別的api開發(fā);

3、聲明應(yīng)用所需要的硬件和軟件參數(shù),比如相機(jī)、藍(lán)牙、多點(diǎn)觸控屏幕;

4、應(yīng)用需要連接的其他的api庫(kù)(除了安卓基本框架庫(kù)以外的),比如谷歌地圖庫(kù);

5、更多其他的內(nèi)容

Declaring components

配置文件的主要任務(wù)就是告知系統(tǒng)應(yīng)用的組件信息,例如:

android:label="@string/example_label"...>

...

這個(gè)元素節(jié)點(diǎn)中,android:icon屬性指向了資源文件的一個(gè)用于指示應(yīng)用程序的圖標(biāo)

這個(gè)元素節(jié)點(diǎn)中,android:name這個(gè)屬性指明了這個(gè)activity的全程類名(包括包名的),android:label屬性指明了一個(gè)用戶可見的activity標(biāo)簽的字符串。

你必須通過(guò)這樣的方法聲明所有的組件:

elements for services

elements for activities

elements for broadcast receivers

elements for content providers

Activities, services, and content providers,這些你在代碼中實(shí)現(xiàn)但是沒有在配置文件中聲明對(duì)于系統(tǒng)是不可見的,并且是不可以使用運(yùn)行的。然而,廣播接收者既可以在配置文件中聲明,也可以在代碼中動(dòng)態(tài)生成并且通過(guò)調(diào)用registerReceiver().的方法向系統(tǒng)注冊(cè)這個(gè)接收器。

Declaring component capabilities

正如我們?cè)?a target="_blank" rel="nofollow">Activating Components一節(jié)中所討論的,你可以使用意圖去啟動(dòng)activity、service、broadcast receiver。你可以在intent中顯式的指明目的組件(使用組件的類名)完成這些任務(wù),然而,intent的真正的力量卻在于它的隱式使用。一個(gè)隱式的intent可以簡(jiǎn)單的描述需要響應(yīng)的action(你也可以選擇基于哪種data類型響應(yīng)),同時(shí)系統(tǒng)會(huì)在設(shè)備中尋找可以響應(yīng)intent中描述的action的組件并啟動(dòng)它。如果有多個(gè)組件符合描述條件的話,用戶可以選擇使用其中一個(gè)。

系統(tǒng)判別可以響應(yīng)intent的組件的方法是通過(guò)將設(shè)備中安裝的應(yīng)用的應(yīng)用配置文件中所提供的intent filters與接收到的intent對(duì)象進(jìn)行匹配比較。

當(dāng)你在你的應(yīng)用文件中聲明一個(gè)activity的時(shí)候,你可以選擇給activity添加intent filters表明它可以響應(yīng)的來(lái)自于其他應(yīng)用的intent。你可以給你的組件聲明一個(gè)intent filter通過(guò)添加一個(gè)元素作為組件元素的字節(jié)點(diǎn)。例如:

...

然后,當(dāng)其他應(yīng)用生成了一個(gè)帶有ACTION_SEND這個(gè)action的intent并將其傳遞到方法startActivity()的時(shí)候,系統(tǒng)就會(huì)啟動(dòng)你的activity,因此用戶可以使用它起草并發(fā)送郵件。

Declaring app requirements

各種各樣的硬件設(shè)備使用安卓系統(tǒng),而且并非所有的硬件設(shè)備提供相同的硬件參數(shù)和能力。為了避免你的應(yīng)用被安裝到不符合你的應(yīng)用的硬件需求的設(shè)備上面,通過(guò)在應(yīng)用配置文件中聲明你的應(yīng)用所支持的設(shè)備類型是非常重要的。系統(tǒng)并不會(huì)讀取這些聲明內(nèi)容,但是一些外部服務(wù)(比如Google play)會(huì)讀取這些聲明為了給用戶提供合適的應(yīng)用當(dāng)他們?cè)谧约旱脑O(shè)備上搜索應(yīng)用的時(shí)候。

比如,如果你的應(yīng)用需要相機(jī)并且使用安卓2.1的系統(tǒng),你應(yīng)該在配置文件中這樣聲明:

android:required="true"/>

...

這樣子,所有沒有相機(jī)或者是系統(tǒng)低于2.1的設(shè)備都不會(huì)從Google play上安裝到你的應(yīng)用。

然而,你可以聲明你的應(yīng)用會(huì)使用到相機(jī),但并不是一定需要它。在這種情況下,你的應(yīng)用應(yīng)該設(shè)置required屬性為false 并在運(yùn)行的時(shí)候檢測(cè)設(shè)備是否有相機(jī)并屏蔽相關(guān)的相機(jī)功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,761評(píng)論 25 709
  • 轉(zhuǎn)自 1. 什么是Activity? 四大組件之一,一般的,一個(gè)用戶交互界面對(duì)應(yīng)一個(gè)activity setCon...
    joe1632閱讀 1,463評(píng)論 0 7
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,295評(píng)論 0 17
  • 寒林小語(yǔ) 人和人相處,會(huì)有點(diǎn)“外香近臭”,對(duì)外人和顏悅色,熱情洋溢;對(duì)家人冷言冷語(yǔ),寒若冰...
    寒林小徑閱讀 705評(píng)論 0 2
  • 2017-8-29 晴 一、照見未來(lái)。 人的兩大需求: 1、精神文化。 內(nèi)在驅(qū)動(dòng)力——人前行的動(dòng)力。 如:格局、夢(mèng)...
    實(shí)干作品閱讀 412評(píng)論 0 1

友情鏈接更多精彩內(nèi)容