2010年10月21日 星期四

AndroidManifest 設定檔- 基本概念

一.說明
在每個Android Application內一定會在Project根目錄下配置一個AndroidManifest.xml檔案
這檔案提供以下幾個作用
1.設定這個Application的Java Package Name
  也就是設定一個Java Package路徑用來代表這個Application        
2.設定組成這App的所有元件
  包括Activity,Service,ContentProvider,BroadCast Receiver等,
  開發好的元件都需要註冊在這Manifest檔案內,如果沒註冊在這裡,
  元件無法被使用。除了註冊元件,並利用Intent Filter讓Android
  知道在什麼狀況可以啟動哪個元件        
3.決定哪些程序將可以控制元件
4.宣告了App需要有哪些權限去取得被保護的資料或執行其他App的元件功能      
5.宣告了本App允許讓其他App互動的權限    
6.提供執行中Instrumention Classes清單與相關資料
  這些資料只有開發階段會存在,發布後會被移除
7.宣告了這App執行所要求的最低Android API版本        
8.設定這App需要連結的API Libraries
    除了預設使用Android API外,可以利用設定<uses-library>
    使用其他package的元件功能API
二.語法原則
1.element
1.<manifest> and <application>只能出現一次,其他的都可以出現多次
2.<activity>, <provider>與<service> 可以沒有順序性的出現在任何
  地方,但<activity-alias>一定要跟在<activity>後面
2.attribute
所有的屬性都是非必填的選項,除了manifest外,所有元素的屬性一定都是以android:命名
3.Class name
在Manifest內,多數的元素都直接對應到Java Class,包括application本身
如activities (activity), services (service), broadcast receivers (receiver)
與content providers (provider)


如果要在Manifest內加入這幾個class的subclass,subclass,則在name屬性上,
輸入完整的Class名稱(包括package name)
例 加入一個繼承自Service的subClass SecretService
 <manifest . . . >  
      <application . . . >  
           <service android:name="com.example.project.SecretService" . . . >  
                . . .  
           </service>  
           . . .  
      </application>  
 </manifest>  

如果這subClass是在這Application的package下,則在name屬性上
只要用.ClassName方式設定即可,系統看到.name會自動將Ap的package 加上去

 <manifest package="com.example.project" . . . >  
      <application . . . >  
           <service android:name=".SecretService" . . . >  
                . . .  
           </service>  
           . . .  
      </application>  
 </manifest>  

當要啟動這元件時,若這subClass存在,系統會產生這subclass(範例是SecretService)的instance使用,
若subclass不存在,則會產生其base class(範例是Service)的instance
4.Multiple values
若一個項目可以有多個值存在,會用多個tag repeat,而不會在一個tag寫入多個值

 <intent-filter . . . >  
      <action android:name="android.intent.action.EDIT" />  
      <action android:name="android.intent.action.INSERT" />  
      <action android:name="android.intent.action.DELETE" />  
      . . .  
 </intent-filter>  
5.resource value
會需要用到resource 當作屬性值時會以
[package:]type:name表示
若是來自於style theme的值則會是
?[package:]type:name
6.String values
當屬性值為字串會用到\\當跳脫字元,例\\n 換行

三.幾項元素功能作用
1.Intent Filters
在manifest內,主要的幾個元件如Activity Service...等利用Intent Filter設定對intent的處理能力
也就是說,用Intent Filter描述他可以處理那些intent,在一個元件可以是可以同時設定多組的intent filter。
Android系統在收到intent後可以依此決定要啟動哪個元件來處理intent需求

2.Icons and Labels
許多元素都有icon與label顯示小圖與文字在使用介面上,有的會有description 放比較多的說明文字。
例如在permission上,這三個屬性都有,當Application對系統要求取得權限時,依照提供的permission設定
就可以把這3個屬性的資料顯示在介面上

如果在上層的container上設定icon與label,那麼其子元素的icon與label都會以上層設定
當作預設值

3.Permissions
用來設定去存取Device資料,啟動其他App的元件或是本身元件被其他App使用的權限設定
一個Appication可以用permission保護其元件,所有的Permission都被定義在
android.Manifest.permission Class內,也可以自行定義自己的Permission


 <manifest . . . >  
      <permission android:name="com.example.project.DEBIT_ACCT" . . . />  
      . . .  
      <application . . .>  
           <activity android:name="com.example.project.FreneticActivity"  
                      android:permission="com.example.project.DEBIT_ACCT"  
                      . . . >  
                . . .  
           </activity>  
      </application>  
      . . .  
      <uses-permission android:name="com.example.project.DEBIT_ACCT" />  
      . . .  
 </manifest>  
以上除了定義permission外還要宣告uses-permission讓其他App可以使用這個元件
<permission-tree>:定義一個permissions group的namespace
<permission-group> :定義一組permission的label,純粹只是定義一個名稱
<permission>:若要定義屬於哪個group,則在group屬性設定
     <permission-group>設定的名稱即可

4.Libraries
每個Application預設連結到Android Library,如果要使用其他Library的package
則需要用uses-library宣告

沒有留言: