安卓Application Fundamentals

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


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


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

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

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

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

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

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

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

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

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

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

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

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

Activities

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

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


Services

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

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


Content providers

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

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

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


Broadcast receivers

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

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


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

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

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

Activating Components

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

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

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

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

至于content provider并不是由意圖來激活的。一個來自于ContentResolver的需求指向某個content provider的時候,它才會被激活。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、你可以啟動一個activity通過傳遞一個意圖到方法startActivity()或者是startActivityForResult()(當你希望啟動的activity能夠返回一個結(jié)果的時候)

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

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

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

The Manifest File

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

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

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

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

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

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

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

Declaring components

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

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

...

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

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

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

elements for services

elements for activities

elements for broadcast receivers

elements for content providers

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

Declaring component capabilities

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

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

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

...

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

Declaring app requirements

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

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

android:required="true"/>

...

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

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

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

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

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

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