Android清單文件詳解(一) ---- 一切從 開始


在AndroidManifest.xml文件中,首先看到是的<manifest>節點,它是整個應用程序的基本屬性,涵蓋了默認進程名字,應用程序標識,安裝位置,對系統的要求以及應用程序的版本等。它是AndroidManifest.xml文件的根節點,其中必須包含一個<application>節點,並且必須指定xmlns:android和package屬性,其語法如下面的代碼所示:

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="string"

android:sharedUserId="string"

android:sharedUserLabel="string resource"

android:versionCode="integer"

android:versionName="string"

android:installLocation=["auto"|"internalOnly"|"preferExternal"]>

.............

</manifest>

 

需要注意的是,在上面的描述的眾多屬性中,除了xmlns和package節點外,其余都是可選節點,Android為它們提供了默認值。接下來,我們就來詳細的說明<manifest>節點中這些屬性的含義及其作用。

 

1.xmlns:android屬性——定義命名空間

 

 

這個屬性定義了這個XML文件所使用的命名空間。如果需要指定特殊的命名空間,就需要手動編寫代碼,基本格式如下:

 

xmlns:<命名空間標識>="http://schemas.android.com/apk/res/<完整的包名>"

 

注意:代碼中的<>部分必須填寫的部分,千萬不可遺漏!

 

我們就從萬能的HelloWorld開始講解,打開最新的android開發工具android studio,創建一個名為HelloWorld的項目,項目會自動生成AndroidManifest.xml文件,我們來看看它的結構。

 

 

 

如果“標識”不匹配,產生的結果如下圖所示:

 

錯誤提示:

 

 

“資源所在包名“是一個必須存在的Java包名,如果不存在,同樣也會出錯。

 

看到了以上圖解,大家明白了吧!標識和資源包名等一定要統一,不能隨性而寫,否則無論怎么折騰都只能原地踏步了。切記!

 

2.package屬性——應用程序的身份證

 

package屬性唯一標識了一個應用程序。注意,它是唯一的!同樣,它也是應用程序進程的默認名字以及應用程序中每個Activity的默認任務(taskAffinity)。通常情況下,當我們完成創建的時候,它就有了默認值。那么,這些默認的名字到底從哪里來的呢?如下圖:

 

 

運行此程序,此時Android設備就會為這個應用啟動一個這樣的進程,如下圖:

 

 

看清楚了嗎?說到這里,你可能會冒出一個想法:要是我安裝另一個有相同package屬性的應用程序,會有什么事情發生呢?會提示如下錯誤:

 

Failure[INSTALL_FAILED_ALREADY_EXSIST]

 

注意:除非特殊需要,否則不建議修改package屬性的值!原因是package是唯一標識了我們應用程序的屬性,如果你試圖改變它的值,那么系統通常會認為這是一個不同的應用程序,會導致擁有前一版本應用程序的用戶無法擁有新版本的應用程序。

 

3.android:sharedUserId屬性——共享數據

 

該屬性定義了需要和其他應用程序共享的Linux用戶ID。默認情況下,Android系統為每一個應用程序分配一個唯一的用戶ID。然而,當這個屬性在多個應用程序中被設置為相同值的時候,它們將共享一個用戶ID。這樣做的好處是,它們之間可以相互訪問彼此的數據,如有需要,它們還將在相同的進程中運行。Helloworld應用並沒有設置這個屬性,這就意味着它沒有和別的應用程序存在共享關系,這樣它們 之間就需要通過其他手段(如進程間通信)實現數據互訪。

 

與android:sharedUserId屬性相關的屬性還有android:sharedUserLabel,這個屬性給共享的用戶ID定義了一個用戶可讀的標簽。這個標簽必須用字符串資源來設置,不能使用原生的字符串。這個屬性在API  LEVEL3中引用,只有設置了sharedUserId屬性時才有意義。

 

4.android:versionCode屬性——內部版本號

 

android:versionCode屬性的值是一個內部版本號,用於確定這個版本是否比另一個版本更新,數字越大表明它就越新。它不是顯示給用戶看的版本號,而是由versionName屬性設置的號碼。版本號將決定一些服務的行為,比如替換應用程序時是否執行備份還原操作等。

 

該號碼必須設為整數,如100。此外,我們可以隨心所欲地定義這個整數,只要每個繼任的版本能有一個更大的數字即可。例如,它可以是一個編譯號碼。

 

5.android:versionName屬性——顯示給用戶的版本號

 

android:versionName屬性的值是顯示給用戶的版本號,它可以被設置為一個原始字符串或者一個字符串資源的引用。這個字符串除了要顯示給用戶外,沒有其他的目的。在HelloWorld中,顯示給用戶的版本號為1.0,如下圖:

 

 

6.android:installLocation屬性——安裝位置

 

該屬性定義了應用程序默認的安裝位置,共有3個可選值,其形式如下:

 

android:installLocation=["auto"|"internalOnly"|"preferExternal"]

 

下表說明了這3個可選值的含義。

 

 

描述
auto 應用程序可能被安裝到外部存儲設備中,但默認情況下系統將會把應用程序安裝到內部存儲設備中。如果內存不足,那么系統將會把應用程序安裝到外部存儲設備中。
                                      internalOnly                                               應用程序必須安裝到設備的內部存儲設備中。如果設置了這個值,那意味着應用程序將永遠不會安裝到外部存儲設備中去。如果內存不足,那么系統將不會安裝這個APK。在沒有設置android:installLocation屬性的情況下,internalOnly是該屬性的默認值。
preferExternal 應用程序將會被安裝到外部存儲設備中,如果系統不支持外部存儲設備或者外部設備已滿,那么系統將會把這個應用程序安裝到內部存儲設備中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM