在AndroidManifest.xml文件中,首先看到是的<manifest>節點,它是整個應用程序的基本屬性,涵蓋了默認進程名字,應用程序標識,安裝位置,對系統的要求以及應用程序的版本等。它是AndroidManifest.xml文件的根節點,其中必須包含一個<application>節點,而且必須指定xmlns:android和package屬性,其語法以下面的代碼所示:android
<manifest xmlns:android="http://schemas.android.com/apk/res/android"app
package="string"工具
android:sharedUserId="string"開發工具
android:sharedUserLabel="string resource"spa
android:versionCode="integer"xml
android:versionName="string"進程
android:installLocation=["auto"|"internalOnly"|"preferExternal"]>內存
.............ci
</manifest>資源
須要注意的是,在上面的描述的衆多屬性中,除了xmlns和package節點外,其他都是可選節點,Android爲它們提供了默認值。接下來,咱們就來詳細的說明<manifest>節點中這些屬性的含義及其做用。
這個屬性定義了這個XML文件所使用的命名空間。若是須要指定特殊的命名空間,就須要手動編寫代碼,基本格式以下:
xmlns:<命名空間標識>="http://schemas.android.com/apk/res/<完整的包名>"
注意:代碼中的<>部分必須填寫的部分,千萬不可遺漏!
咱們就從萬能的HelloWorld開始講解,打開最新的android開發工具android studio,建立一個名爲HelloWorld的項目,項目會自動生成AndroidManifest.xml文件,咱們來看看它的結構。
若是「標識」不匹配,產生的結果以下圖所示:
錯誤提示:
「資源所在包名「是一個必須存在的Java包名,若是不存在,一樣也會出錯。
看到了以上圖解,你們明白了吧!標識和資源包名等必定要統一,不能隨性而寫,不然不管怎麼折騰都只能原地踏步了。切記!
package屬性惟一標識了一個應用程序。注意,它是惟一的!一樣,它也是應用程序進程的默認名字以及應用程序中每一個Activity的默認任務(taskAffinity)。一般狀況下,當咱們完成建立的時候,它就有了默認值。那麼,這些默認的名字到底從哪裏來的呢?以下圖:
運行此程序,此時Android設備就會爲這個應用啓動一個這樣的進程,以下圖:
看清楚了嗎?說到這裏,你可能會冒出一個想法:要是我安裝另外一個有相同package屬性的應用程序,會有什麼事情發生呢?會提示以下錯誤:
Failure[INSTALL_FAILED_ALREADY_EXSIST]
注意:除非特殊須要,不然不建議修改package屬性的值!緣由是package是惟一標識了咱們應用程序的屬性,若是你試圖改變它的值,那麼系統一般會認爲這是一個不一樣的應用程序,會致使擁有前一版本應用程序的用戶沒法擁有新版本的應用程序。
該屬性定義了須要和其餘應用程序共享的Linux用戶ID。默認狀況下,Android系統爲每個應用程序分配一個惟一的用戶ID。然而,當這個屬性在多個應用程序中被設置爲相同值的時候,它們將共享一個用戶ID。這樣作的好處是,它們之間能夠相互訪問彼此的數據,若有須要,它們還將在相同的進程中運行。Helloworld應用並無設置這個屬性,這就意味着它沒有和別的應用程序存在共享關係,這樣它們 之間就須要經過其餘手段(如進程間通訊)實現數據互訪。
與android:sharedUserId屬性相關的屬性還有android:sharedUserLabel,這個屬性給共享的用戶ID定義了一個用戶可讀的標籤。這個標籤必須用字符串資源來設置,不能使用原生的字符串。這個屬性在API LEVEL3中引用,只有設置了sharedUserId屬性時纔有意義。
android:versionCode屬性的值是一個內部版本號,用於肯定這個版本是否比另外一個版本更新,數字越大代表它就越新。它不是顯示給用戶看的版本號,而是由versionName屬性設置的號碼。版本號將決定一些服務的行爲,好比替換應用程序時是否執行備份還原操做等。
該號碼必須設爲整數,如100。此外,咱們能夠爲所欲爲地定義這個整數,只要每一個繼任的版本能有一個更大的數字便可。例如,它能夠是一個編譯號碼。
android:versionName屬性的值是顯示給用戶的版本號,它能夠被設置爲一個原始字符串或者一個字符串資源的引用。這個字符串除了要顯示給用戶外,沒有其餘的目的。在HelloWorld中,顯示給用戶的版本號爲1.0,以下圖:
該屬性定義了應用程序默認的安裝位置,共有3個可選值,其形式以下:
android:installLocation=["auto"|"internalOnly"|"preferExternal"]
下表說明了這3個可選值的含義。
值 | 描述 |
auto | 應用程序可能被安裝到外部存儲設備中,但默認狀況下系統將會把應用程序安裝到內部存儲設備中。若是內存不足,那麼系統將會把應用程序安裝到外部存儲設備中。 |
internalOnly | 應用程序必須安裝到設備的內部存儲設備中。若是設置了這個值,那意味着應用程序將永遠不會安裝到外部存儲設備中去。若是內存不足,那麼系統將不會安裝這個APK。在沒有設置android:installLocation屬性的狀況下,internalOnly是該屬性的默認值。 |
preferExternal | 應用程序將會被安裝到外部存儲設備中,若是系統不支持外部存儲設備或者外部設備已滿,那麼系統將會把這個應用程序安裝到內部存儲設備中。 |