任何 Android應(yīng)用程序的基礎(chǔ)都是 Manifest文件: Manifest.xml,這個文件保存在工程的根目錄下。在這個文件里聲明應(yīng)用程序用到的所有組件,例如: activities, services,等等,而且說明這些組件如何組織到應(yīng)用程序系統(tǒng)中;例如:可以表明哪一個 activity(或者 activities)應(yīng)該出現(xiàn)在設(shè)備的主窗口中(例如: launcher)。
當(dāng)你創(chuàng)建工程時,系統(tǒng)幫助生成一個原始的 manifest文件。對于只包含一個 activity的簡單的應(yīng)用程序,原始的 manifest文件夠了,或者只需要很小的改動。另外, manifest也可以很復(fù)雜,比如 Android自帶的 API樣例,該文件就超過 1000多行。你的應(yīng)用程序的 manifest行數(shù)大概也就介于此間吧。
manifest文件的大部分有趣的功能會在以后相應(yīng)的章節(jié)更加詳細(xì)的介紹。比如 service元素會在創(chuàng)建 service章節(jié)詳細(xì)講述。現(xiàn)在,主要關(guān)注 manifest文件的作用和它的一般結(jié)構(gòu)。
在文件開始,有根,文件基本上就正確
manifest文件的根是這樣一個 manifest元素:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commonsware.android.search">
...
</manifest>
注意命名空間聲明。奇怪的是,自動生成的 manifest文件,命名空間是應(yīng)用在屬性上,而不是元素上(例如,是 manifest,不是 android:manifest),然而,這種形式工作正確,只要 android不發(fā)生改變,就堅持用這種形式。
根元素 manifest里面最有用的信息是 package屬性(奇怪的是 package前沒有命名空間)。這里,你可填成你的 java package的名子,以后在 manifest文件里,如果需要類的名子,就可以用點(diǎn)來代替 package的名子,例如:如果在 manifest文件需要引用 com.commonsware.android.search.Snicklefritz,你就可以寫成 .Snicklefitz,因為 com.commonsware.android.search已經(jīng)被定義成應(yīng)用程序的包。
權(quán)限,特殊工具,和應(yīng)用程序
在 manifest元素里有如下子元素:
l uses-permission元素,表示應(yīng)用程序必須據(jù)有這些權(quán)限才能工作正常- permissions章節(jié)
l permission元素,定義一些權(quán)限,當(dāng)其它的程序如果想使用你的程序的數(shù)據(jù)或者邏輯時,必須據(jù)有這些權(quán)限,參考 permissions章節(jié)
l instrumentation元素,表示某些代碼,當(dāng)一些重要的系統(tǒng)事件發(fā)生時,這些代碼被調(diào)用,例如:啟動一個 activities,打印 log或者監(jiān)視某些信息。
l uses-library元素,掛鉤( hook)進(jìn)可選的 android組件里,例如 mapping services。
l application元素,定義 manifest描述的應(yīng)用程序的細(xì)節(jié)。
在上面的例子中, uses-permission元素表明了應(yīng)用程序?qū)⒁褂玫囊恍┰O(shè)備的功能,在這個例子中,就是程序據(jù)有了定位自己的功能。 applicaton元素描述了一些 activities, serives和其它組成應(yīng)用的一些組件。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commonsware.android">
<uses-permission
android:name="android.permission.ACCESS_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_GPS" />
<uses-permission
android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission
android:name="android.permission.ACCESS_CELL_ID" />
<application>
...
</application>
</manifest>
應(yīng)用程序需要實(shí)現(xiàn)一些功能,對嗎?
manifest文件最重要的部分就是 application元素的子元素。
創(chuàng)建新工程時,默認(rèn)生成只含一個 activity元素的 manifest文件,如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commonsware.android.skeleton">
<application>
<activity android:name=".Now" android:label="Now">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
這個 activity元素提供了如下信息, android:name-實(shí)現(xiàn) activity的類;和 android:label-當(dāng)運(yùn)行 activity時顯示的名字; intent-filter子元素-描述在什么條件下 activity才顯示。這個 activity元素設(shè)置在運(yùn)行時顯示這個 activity,現(xiàn)在你可以運(yùn)行它了。在后面的章節(jié),會看到有多個 activities的工程。
可能還會有一個或者多個 receiver元素,表示在一定條件下,一些非 activites組件需要被觸發(fā),例如收到一條短信。這被稱作是 intent receivers,在后續(xù)章節(jié)會講到。
可能還會有一個或者多個 provider元素,表示 content providers組件,它們負(fù)責(zé)提供數(shù)據(jù)給 activities使用,并且,如果有權(quán)限,其它應(yīng)用程序也可以使用它們提供的數(shù)據(jù)。它們把數(shù)據(jù)庫或者其它數(shù)據(jù)存儲包裝成一個接口 供其它應(yīng)用程序使用。后續(xù)章節(jié)會講怎么創(chuàng)建 content provides和如何使用 content provides。
最后,可能會有一個或者多個 service元素,描述 services-獨(dú)立于 activity,并且長期運(yùn)行的一些代碼片段。最好的例子就是 mp3播放器,你想邊聽音樂,邊打開其它 activities,這時候 mp3播放器的使用界面被覆蓋。后面有兩章會講如何創(chuàng)建和使用 services。