最近一直在閱讀Android開發者網站的API Guide,眼睛看見的知識終歸淺薄,現將知識點記錄下來并付諸實踐,以供日后翻閱。
Android采用Java語言編寫,Android的SDK開發工具將我們Java源代碼及資源文件等生成可供用戶下載安裝的APK(Android application package),即.apk文件。安裝到設備后,每個 Android 應用都運行在自己的安全沙箱內。
我們知道,Android系統是構筑在Linux系統之上的,Android 操作系統是一種多用戶 Linux 系統,其中的每個應用都是一個不同的用戶,每個進程都具有自己的虛擬機,因此應用代碼是在與其他應用隔離的環境中運行,如需訪問其他應用的資源,可以與其他應用共享同一 Linux 用戶 ID,或者獲取相關訪問權限。Android的權限訪問機制大大增加了Android系統的安全性。
一、應用組件
應用組件是 Android 應用的基本構建基塊,共有四種不同的應用組件類型。每種類型都服務于不同的目的,并且具有不同生命周期。Android中共有四種不同類型組件:
(1)Activity
Activity表示具有用戶界面的單一屏幕。我們對一個應用最直觀的感受就體現在Activity上,它是用戶可以直接看到的展示界面,每一個Activity都是獨立存在的。
(2)Service
Service(服務)是一種在后臺運行的組件,用于執行長時間運行的操作或為遠程進程執行作業。 服務不提供用戶界面,相當于一個默默無聞的工作者,例如,我們后臺播放音樂以及文件的上傳下載,都依靠Service來實現。
(3)ContentProvider
ContentProvider(內容提供程序)管理一組共享的應用數據。我們可以將數據存儲在文件系統、SQLite 數據庫、網絡上或應用可以訪問的任何其他永久性存儲位置。 其他應用可以通過內容提供程序查詢數據,甚至修改數據(如果內容提供程序允許)。例如,我們訪問系統通訊錄數據,也是通過內容提供器的接口來實現,但必須具有相應的訪問權限。
(4)BroadcastReceiver
BroadcastReceiver(廣播接收器)是一種用于響應系統范圍廣播通知的組件。很多時候我們的應用需要接收一些通知來進行相應的處理,例如 ,鎖屏、電量不足、短信到來等廣播,這些廣播一般由系統發出來通知應用。應用也可以發起廣播 ,例如,通知其他應用某些數據已下載完成,并且可供其使用。 雖然廣播接收器不會顯示用戶界面,但它們可以創建狀態欄通知,在發生廣播事件時提醒用戶。
二、啟動組件
前面所說的Android系統基于Linux系統設計,每個應用都運行在單獨的進程中,是不是意味著應用的組件不能跨進程調用?然而并非如此,Android 系統設計的獨特之處在于,任何應用都可以啟動其他應用的組件,這涉及到Intent和Intent過濾器的使用,詳情可以參閱我的另一篇文章:Intent 和 Intent 過濾器。
每種類型的組件都有不同的啟動方法:
(1)Activity
- 通過將Intent傳遞到startActivity()來啟動Activity
- 通過將Intent傳遞到startActivityForResult()來啟動 Activity,此方法可獲得被啟動的Activity 返回的結果
(2)Service
- 通過將Intent傳遞到startService()來啟動Service,此方法啟動該Service的組件與被啟動的Service并無關聯
- 通過將Intent傳遞到bindService()來綁定該Service,此方法綁定該Service的組件能夠控制被綁定Service的生命周期,并且能夠與之交互并進行進程間通信(IPC)
(3)BroadcastReceiver
- 通過將Intent傳遞到sendBroadcast()來發起廣播,所有監聽該廣播的廣播接收器都能收到該廣播
- 通過將Intent傳遞到sendOrderedBroadcast()來發起廣播,按照廣播接收器的優先級順序接收廣播
- 通過將Intent傳遞到sendStickyBroadcast()來發起廣播,發出的廣播會一直滯留(等待),一旦有人注冊相應廣播接收器后能盡快的收到這條廣播。
(4)ContentProvider
與前三類組件不同,Intent 不會啟動內容提供程序,而是通過在 ContentResolver上調用 query()來對內容提供程序執行查詢。
三、清單文件(AndroidManifest.xml)
清單文件在整個應用程序中起到一個非常重要的配置作用,應用程序需要用到的相關內容都需要在清單文件中先注冊,清單文件的作用有很多,下面列出主要的幾種:
(1)聲明應用組件
在 Android 系統啟動應用組件之前,系統必須通過讀取應用的 AndroidManifest.xml
文件確認組件存在。因此,所有組件都必須在清單文件中注冊,清單文件的主要任務是告知系統有關應用組件的信息,這樣才能讓系統找到對應的組件。例如,可以在清單文件中這樣聲明 Activity:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:icon="@drawable/app_icon.png" ... >
<activity android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
</activity>
...
</application>
</manifest>
其中,Activity 使用<activity>元素聲明,服務使用<service>元素聲明,廣播接收器使用<receiver>元素聲明,內容提供器使用<provider>元素聲明。
值得一提的是,廣播接收器不是必須在清單文件中注冊的,它還可以通過在java文件中動態注冊來實現----動態創建(BroadcastReceiver對象)并且通過調用registerReceiver()注冊到系統中。
(2)聲明用戶權限
應用運行時需要獲得許多相關權限,如互聯網訪問權限或對用戶聯系人的讀取權限等,這些需要用到的權限必須在清單文件中聲明。例如,在清單文件中聲明網絡訪問權限,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<uses-permission android:name="android.permission.INTERNET"/>
<application... >
...
</application>
</manifest>
(3)聲明應用要求
由于市場上基于 Android 系統的設備多種多樣,并非所有設備都提供相同的特性和功能。 因此,為防止將應用安裝在缺少應用所需特性的設備上,必須通過在清單文件中聲明設備和軟件要求,為應用支持的設備類型明確定義一個配置文件。
其中的大多數聲明只是為了提供信息,系統不會讀取它們,但 Google Play 等外部服務會讀取它們,以便當用戶在其設備中搜索應用時為用戶提供過濾功能。
- 聲明應用所需的最低API級別:
----使用<uses-sdk>元素,屬性android:minSdkVersion指定能夠運行應用的最低 API 級別。 - 聲明應用使用或需要的硬件和軟件功能,如相機、藍牙服務或多點觸摸屏幕:
----使用<uses-feature>元素,用于描述應用程序所依賴的、重要的、可用的設備功能。
例如,如果您的應用需要相機,并使用 Android 2.1(API 級別7)中引入的 API,應該像下面這樣在清單文件中以要求形式聲明這些信息:
<manifest ... >
<uses-feature android:name="android.hardware.camera.any"
android:required="true" />
<uses-sdk android:minSdkVersion="7"
android:targetSdkVersion="19" />
...
</manifest>
現在,沒有相機且 Android 版本低于2.1 的設備將無法從應用市場上安裝該應用。不過,也可以聲明應用使用相機,但并不要求必須使用。 在這種情況下,應用必將 required屬性設置為 "false",并在運行時檢查設備是否具有相機,然后根據需要停用任何相機功能。
(4)聲明應用需要鏈接的 API 庫
很多時候,我們需要將第三方API引入我們的應用作為服務來供我們使用,如 Google 地圖庫,此時也需要向清單文件來聲明我們應用需要鏈接的API庫,如下所示:
<application>
...
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY"/>
</application>
其中“YOUR_API_KEY”代表獲得的 API 密鑰,要使用 Google Places API ,必須向應用添加 Google API 密鑰。
四、應用資源
Android 應用并非只包含代碼,它還需要與源代碼分離的資源,如圖像、音頻文件以及任何與應用的視覺呈現有關的內容。如下圖所示,一個Android項目除了java文件、AndroidManifest.xml文件以外,res文件夾所代表的資源文件也占了很大一部分。
提供與源代碼分離的資源的其中一個最重要優點在于,我們可以提供針對不同設備配置的備用資源。使用應用資源能夠在不修改代碼的情況下輕松地更新應用的各種特性,并可通過提供備用資源集讓我們能夠針對各種設備配置(如不同的語言和屏幕尺寸)來優化我們的應用。