Android系統編程入門系列之清單文件

在上一篇文章中已經提到,Android系統加載應用程序以後,首先會讀取該應用程序的AndroidManifest.xml清單文件,以後根據該清單文件加載後邊的東西。因此要開發應用程序,天然要先知道清單文件中都記錄了什麼東西。通常地,在清單文件中聲明定義的內容,稱爲靜態註冊,相對應地,能夠在代碼中定義的內容,稱爲動態註冊。android

清單文件的存儲位置就是應用程序的根目錄,並且文件名也是固定的,必須爲AndroidManifest.xml,清單文件中所包含的內容在Android官網應用清單文件中可查。其中的內容主要有如下三部分。app

應用基本信息

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

versionCodeversionName兩個屬性分別標記了應用的版本信息,其中versionCode能夠在Android系統的設置-應用設置-該應用信息中展現,而versionName只能在應用內部顯示調用展現。
在開發環境AndroidStudio上,這兩個屬性能夠經過主應用module下的build.gradle文件直接配置。gradle

上邊這些做爲基本信息,在Android系統加載該應用時首先加載使用。簡而言之,package保證了Android系統上運行的軟件與軟件之間的惟一性,而versionCode保證了Android系統上所運行的同一個軟件在不一樣版本之間的惟一性。有了這些基礎信息,就能夠肯定下邊要加載的其餘內容了。優化

權限聲明

應用程序可能須要聯網操做,或者訪問Android系統上的系統級應用中的內容,好比通信錄信息,這些可能涉及到用戶隱私的操做和數據,統一概括爲應用權限。ui

應用程序所使用到的權限都要在清單文件中以<uses-permisson />標籤形式聲明,在name屬性值中填入相關權限名。這裏的權限名不只可使用Android系統已經提供的權限,還可使用當前應用程序的自定義權限和其餘應用程序的自定義權限。自定義權限一樣是在清單文件這裏定義,使用<permission>標籤填寫相關信息便可。google

值得注意的是,從Android6.0開始,應用程序用到的危險權限不只要在清單文件中聲明,並且在涉及該危險權限的代碼調用以前也要動態檢查申請。可查詢Android官網權限列表Protection level: dangerous類型的權限即爲危險權限。code

在動態申請權限時,可以使用checkSelfPermission(String permission)檢查應用是否得到相關權限,若是用戶沒有受權,就須要使用requestPermission(@NonNull String[] permissions, int requestCode)申請相關權限,並在Activity中重載onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)以得到用戶對權限申請的處理結果。xml

在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應用程序中顯示該應用,等待用戶點擊啓動該應用了。

相關文章
相關標籤/搜索