第二章
架構
2.1
架構圖
Linux
核心
Android
的核心系統服務依賴於
Linux 2.6
核心,如安全性,記憶體管理,進程管理,
網路通訊協定棧和驅動模型。
Linux
核心也同時作為硬體和軟體棧之間的抽象層。
原生庫(
Native Library
)
在
Linux
核心之上的是
Android
的原生庫,這些庫均採用
C
或者
C++
編寫的,與硬體結合非常緊密。其中重要的原生庫主要有:
Surface Manager
:對顯示子系統的管理,類似於
Vista
或
Compiz
的表單管理器,但是比這些簡單得多。
2D
和
3G Graphics
:在
Android
中,單一的使用者介面均可由
2D
或者
3D
的元素組成。提供
2D
和
3D
方面的渲染和處理。比如
OpenGL
等。
Media Codecs
:
Android
提供了對大部分主流的音視頻的編解碼功能。
SQL
資料庫:在
Android
中,提供了一個輕量級的
SQLite
資料庫引擎,這個資料庫同樣在
FireFox
和蘋果的
iPhone
中使用。主要完成資料的持久化儲存。
Browser engine
:為了更快速的顯示
HTML
內容,
Android
中使用了
WebKit
庫。
系統運行庫
系統運行庫主要由
Dalvik
虛擬機器和
Java
核心庫組成。
應用程式架構
Active Manager(
Activity Manager
):控制應用程式的生命週期並提供常用的導航回退功能。
內容提供器(
Content providers
):使得應用程式可以訪問另一個應用程式的資料
(
如連絡人資料庫
)
,
或者共用它們自己的資料。
資源管理員(
Resource manager
):提供
非代碼資源的訪問,如本地字串,圖形,和布局檔案。
位置管理器(
Location manager
):任何一部
Android
作業系統的手機均能夠識別所處的位置。
通知管理器(
Notification manager
):使得應用程式可以在狀態列中顯示自訂的提示資訊。
應用程式和
widgets
這是整個系統架構的最高層,主要包括撥打到電話、發送郵件、連絡人管理、
web
瀏覽等等使用者經常使用的應用程式和小工具。
2.2
活動的生命週期及轉換
每一個活動(
Activity
)都處於某一個狀態,對於開發人員來說,是無法控制其應用程式處於某一個狀態的,這些均由系統來完成。但是當一個活動的狀態發生改變的時候,開發人員可以通過調用
onXX()
的方法擷取到相關的通知資訊。
在實現
Activity
類的時候,通過覆蓋(
override
)這些方法即可在你需要處理的時候來調用。
onCreate
:當活動第一次啟動的時候,觸發該方法,可以在此時完成活動的初始化工作。
onCreate
方法有一個參數,該參數可以為空白(
null
),也可以是之前調用
onSaveInstanceState
()方法儲存的狀態資訊。
onStart
:該方法的觸發表示所屬活動將被展現給使用者。
onResume
:當一個活動和使用者發生互動的時候,觸發該方法。
onPause
:當一個正在前台啟動並執行活動因為其他的活動需要前台運行而轉入後台啟動並執行時候,觸發該方法。這時候需要將活動的狀態持久化,比如正在編輯的資料庫記錄等。
onStop
:當一個活動不再需要展示給使用者的時候,觸發該方法。如果記憶體緊張,系統會直接結束這個活動,而不會觸發
onStop
方法。
onRestart
:當處於停止狀態的活動需要再次展現給使用者的時候,觸發該方法。
onDestroy
:當活動銷毀的時候,觸發該方法。和
onStop
方法一樣,如果記憶體緊張,系統會直接結束這個活動而不會觸發該方法。
onSaveInstanceState
:系統調用該方法,允許活動儲存之前的狀態,比如說在一串字串中的游標所處的位置等。通常情況下,開發人員不需要重寫覆蓋該方法,在預設的實現中,已經提供了自動儲存活動所涉及到的使用者介面組件的所有狀態資訊。
活動如果沒有在前台運行,都將被停止或者
Linux
管理進程為了給新的活動預留足夠的儲存空間而隨時結束這些活動。因此對於開發人員來說,在設計應用程式的時候,必須時刻牢記這一原則。在一些情況下,
onPause
方法或許是活動觸發的最後的方法,因此開發人員需要在這個時候儲存需要儲存的資訊。
2.3
組件
在
Android
系統中,提供了很多重要的組件,其中對於開發人員來說,最重要的主要有活動(
activites
)、意圖(
intents
)、
service
(服務)、內容提供器(
content providers
)。
活動(
activities
)
活動簡單的說就是一個使用者介面。應用程式可以由多個使用者介面組成,分別對應不同的階段。
意圖(
intents
)
Intent
是描述某一個操作的機制,比如說擷取一張照片。在
Android
系統中,幾乎所有的工作都通過
Intent
來完成,因此對於開發人員來說,需要經常與
Intent
打交道。
服務(
services
)
服務是運行在後台,不與使用者直接互動的程式,比如
unix
中的守護進程。比如音樂播放器,使用者希望通過一個活動(
activity
)開始播放音樂,然後可以運行其他的軟體,而不用關閉現正播放的音樂。
內容提供器(
Content
provider
)
內容提供器是一組封裝了讀寫方法的資料集合。採用這種方式能更好的在不同的應用程式之間共用全域資料。
2.4
資源
資源是指本地化的字串、位元影像、或其他的非程式碼的東西。在編譯應用的時候,這些資源將被編譯到應用程式中。
2.5
安全性
由於
Android
是基於
Linux
作業系統的,因此其應用程式的運行管理方式與
Linux
一樣,每一個應用程式均運行在自身所屬的
Linux
進程空間裡面。硬體平台禁止進程訪問其他進程的記憶體空間。另外,每一個應用程式都會標註上一個特定的使用者編號,它所建立的任何檔案都不能被其他的應用程式訪問。
另外,訪問臨界操作會受到嚴格的控制,必須在
androidmanifest.xml
檔案中進行申請。安裝應用的時候,包管理器(
package manager
)根據申請進行授權。下面是一些特別重要的許可權:
INTERNET
:訪問互連網。
READ_CONTACTS
:讀取使用者連絡人資料
WRITE_CONTACTS
:寫使用者連絡人資料
RECEIVE_SMS
:監控接收到的文字資訊
ACCESS_COARSE_LOCATION
:調用初級定位器,比如
wifi
ACCESS_FINE_LOCATION
:調用精確定位器,比如
GPS
例如接收簡訊的監控,需要做如下的配置:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.app.myapp"
>
<uses-permission
android:name="android.permission.RECEIVE_SMS" />
</manifest>