1. 程式人生 > 其它 >Android系統程式設計入門系列之清單檔案

Android系統程式設計入門系列之清單檔案

在上一篇文章中已經提到,Android系統載入應用程式之後,首先會讀取該應用程式的AndroidManifest.xml清單檔案,之後根據該清單檔案載入後邊的東西。所以要開發應用程式,自然要先知道清單檔案中都記錄了什麼東西。一般地,在清單檔案中宣告定義的內容,稱為靜態註冊,相對應地,可以在程式碼中定義的內容,稱為動態註冊。

清單檔案的儲存位置就是應用程式的根目錄,而且檔名也是固定的,必須為AndroidManifest.xml,清單檔案中所包含的內容在Android官網應用清單檔案中可查。其中的內容主要有以下三部分。

應用基本資訊

package應用包名屬性,該屬性要保證系統唯一性,也就是說應用程式所執行的Android機器上,不能有相同包名的兩個應用程式。如果想把兩個相同包名的應用程式安裝到同一臺Android機器上,那是連安裝這一步都無法成功的。
在開發環境AndroidStudio上,建議清單檔案中的package屬性與主應用module下的build.gradle檔案中的applicationId保持一致,當然官網也給出了不一致的修改方案,但是開發過程中除非有特殊需求,否則不推薦。

versionCodeversionName兩個屬性分別標記了應用的版本資訊,其中versionCode可以在Android系統的設定-應用設定-該應用資訊中展示,而versionName只能在應用內部顯示呼叫展示。
在開發環境AndroidStudio上,這兩個屬性可以通過主應用module下的build.gradle檔案直接配置。

上邊這些作為基本資訊,在Android系統載入該應用時首先載入使用。簡而言之,package保證了Android系統上執行的軟體與軟體之間的唯一性,而versionCode保證了Android系統上所執行的同一個軟體在不同版本之間的唯一性。有了這些基礎資訊,就可以確定下邊要載入的其他內容了。

許可權宣告

應用程式可能需要聯網操作,或者訪問Android系統上的系統級應用中的內容,比如通訊錄資訊,這些可能涉及到使用者隱私的操作和資料,統一歸納為應用許可權。

應用程式所使用到的許可權都要在清單檔案中以<uses-permisson />標籤形式宣告,在name屬性值中填入相關許可權名。這裡的許可權名不僅可以使用Android系統已經提供的許可權,還可以使用當前應用程式的自定義許可權和其他應用程式的自定義許可權。自定義許可權同樣是在清單檔案這裡定義,使用<permission>標籤填寫相關資訊即可。

值得注意的是,從Android6.0開始,應用程式用到的危險許可權不僅要在清單檔案中宣告,而且在涉及該危險許可權的程式碼呼叫之前也要動態檢查申請。可查詢

Android官網許可權列表Protection level: dangerous型別的許可權即為危險許可權。

在動態申請許可權時,可使用checkSelfPermission(String permission)檢查應用是否獲得相關許可權,如果使用者沒有授權,就需要使用requestPermission(@NonNull String[] permissions, int requestCode)申請相關許可權,並在Activity中過載onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)以獲得使用者對許可權申請的處理結果。

在Android系統檢查並授予當前應用相關許可權之後,就可以啟動當前應用程式了。每個應用程式對應AndroidSDK中的android.app.Application類,Application的生命週期即從應用程式啟動開始,當Android系統因為記憶體過低或電源優化時,被動殺死應用程式結束,也可能是應用程式主動退出結束。

裝置相容

Android系統所搭載的硬體裝置是千差萬別的,而且同一個應用也可能在不同的AndroidSDK的版本上執行,這也就是經常談到的碎片化問題。如果能在清單檔案中聲明當前應用程式需要具備哪些基礎硬體,或者可以在哪些AndroidSDK版本上執行,那就可以在不符合要求的Android系統上禁止安裝該應用程式。

使用<users-feature />標籤可以宣告應用程式所需要的一些硬體要求。
使用<users-sdk />標籤可以宣告應用程式所需要的AndroidSDK版本要求,該標籤下主要有、targetSdkVersionmaxSdkVersiontargetSdkVersion三個屬性值,分別對應應用程式所執行AndroidSdk的最低版本,最高版本,目標版本。在開發環境AndroidStudio上,minSdkVersiontargetSdkVersion這兩個屬性可以通過主應用module下的build.gradle檔案直接配置。

元件宣告

Android系統的實現就是為了更好的和人類交流,交流的途徑主要有四種方式,分別是介面操作(以android.app.Activity類為載體),後臺服務(以android.app.Service類為載體),廣播通知(以android.app.BroadcastReceiver類為載體),資料交換(以android.app.ContentProvider類為載體),將這四種交流方式所依賴的載體統一稱為應用元件,應用元件是依賴於當前應用Application的,所以元件的生命週期只能小於等於當前應用生命週期。

Application對應於清單檔案中的<application></application>標籤。該標籤下有icon屬性載入資原始檔下的圖示,作為應用程式在Android系統的顯示圖示;label屬性則是載入資原始檔下的字串,作為應用程式在Android系統中顯示的應用名;name屬性作為可填項,可以使用繼承自android.app.Application的自定義類,如果不填該屬性值,則預設為android.app.Application。另外還有其他幾個屬性值都可以在Android官網清單檔案-application標籤中查詢,通過這些屬性值配置,可以更方便的指導Android系統管理當前應用程式。

在當前應用確定以後,就需要分別載入該應用下的元件資訊了,應用程式只有一個,但是元件可以有多個,只要名稱不衝突即可,所以元件的宣告是巢狀在<application></application>標籤內部的,下面是每種元件在AndroidManifest.xml中對應的標籤名。

元件名 Activity Service BroadcastReceiver ContentProvider
清單檔案標籤名 activity service receiver provider

元件標籤內必須要有name屬性,以指向程式碼中自定義的元件類,值得注意的是,一個應用程式中,可以有多個介面,多個服務,多個廣播接收器,多個數據提供者,所以name屬性就是為了區分多個相同種類元件的。

provider標籤中還必須要有authorities屬性值,這是由於ContentProvider是對其他應用提供資料,這就好像該應用將資料儲存到一個保險箱中提供給其他應用,而其他應用必須有該保險箱的密碼才能開啟保險箱以訪問該應用的資料,而authorities正是起到這個密碼的類似效果。

activity標籤,service標籤,provider標籤,還可以內嵌<intent-filter><\intent-filter>標籤作為元件內資訊,使用意圖過濾標記的元件,可以在程式碼中快速響應該意圖,執行響應後邏輯。

啟動應用程式後,必須要載入一個Activity介面,而載入哪一個呢?這也就用到<intent-filter><\intent-filter>標籤了,只有在該標籤內嵌套了<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />兩個固定標籤內容的<activity><\activity>,才允許作為第一個介面載入。所以很自然的想到,一個<application><\application>標籤內只允許有一個<activity><\activity>可以巢狀上面的意圖過濾器內容。


至此,Android系統對應用程式的清單檔案基本解析之後,就獲取了該應用的所有靜態資訊,當應用安裝之後,就可以在桌面Launcher應用程式中顯示該應用,等待使用者點選啟動該應用了。