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