Android清单AndroidManifest详细说明


在初见Intent一章中,我们已尝试过使用「startActivity」函式,传入适当的「Intent」,来呼叫浏览器的Activity。

到目前为止,我们可以由学习Android 应用程式的经验中归纳得出:所有Android 程式的运作流程,都定义在Activity 中。

Android 系统与其他系统很不一样的地方是:它的应用程式并不直接与底层系统紧密结合,而是跑在Android 框架中。这意思是设计Android 应用程式时,我们并不需要关心实际上运作的机器是哪一牌的手机或是哪一种嵌入式系统,或使用哪一种架构(ARM、x86、MIPS)。我们要关心的只有Android 框架提供了那些功能,好让我们能操作这台设备。具体来说就是我们只要知道这台机器的萤幕大小、有没有键盘,有没有支援GPS 等等讯息,就知道我们写的应用程式是否能在这台机器上顺畅地运作。Android 框架与底层系统的整合的问题完全可以留给轫体工程师来操心。

在执行「startActivity」函式时,应用程式并不是直接呼叫另一个Activity,而是将「Intent」(意图)传进Android 框架中。Android 框架会查看「startActivity」 呼叫所传入的动作与Intent 内容是否在注册表中,如果符合,就启动对应的服务或Activity。

Android 系统中的每一个应用程式,在安装的过程里,都得事先在Android 框架中注册、登记这个应用程式所建立的Activity,并事先注明会使用到的服务。譬如当我们在Android 上安装我们撰写的BMI 应用程式时,BMI 应用程式就会向Android 框架登记相关资讯:BMI 应用程式将会用到「Bmi」这个Activity。

这份讯息存在于每个Android应用程式专案根目录下的「AndroidManifest.xml」档案中。如果我们在程式里,要用到其他应用程式或服务所提供的功能,也需一并在此列出。

在安装应用程式的时候,Android 框架会根据应用程式提供的这份清单,将资讯注册于Android 框架的注册表中。

备注:

这么说其实是不太精确的。 Android 应用程式的运作流程,存在于四种载体中:
  1. Activity (活动)
  2. Broadcast Intent Receiver
  3. Service
  4. Content Provider

各种载体的相关内容会在后续章节提到时作解说。

预设的Activity 清单

我们使用eclipse Android开发工具打开「BMI/AndroidManifest.xml」档案。切换到「AndroidManifest.xml」分页标签,查看预设的「BMI/AndroidManifest.xml」档案原始码:

 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.demo.android.bmi" 4 android:versionCode="1" 5 android:versionName="1.0"> 6 <application android:icon="@drawable/icon"> 7 <activity android:name=".Bmi" android:label="@string/app_name"> 8 <intent-filter> 9 <action android:name="android.intent.action.MAIN" /> 10 <category android:name="android.intent.category.LAUNCHER" /> 11 </intent-filter> 12 </activity> 13 </application> 14 <uses-sdk android:minSdkVersion="X" /> 15 </manifest> 

我们分行讲解如下:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"   ....>   .... </manifest> 

「AndroidManifest.xml」这个档案也是以XML格式描述,每个Android应用程式都需要一个「AndroidManifest.xml」档案,每份「AndroidManifest.xml」档案的开头都会出现这段叙述。而整个「AndroidManifest.xml」档案的叙述,都包含在「manifest」(清单)这个主要标签中。

 package="com.demo.android.bmi" 

「package」 是「manifest」(清单)标签的一个特别属性,范例中的内容可用来标明,这个应用程式的进入点存在于「com.demo.android.bmi」这个名称空间/路径中。

 android:versionCode="1" android:versionName="1.0" 

「android:versionCode」和「android:versionName」是应用程式版本号。这两个属性是可选的(非必要)。「android:versionName」是给使用者看的版本号,如「1.0」、「2.0」。「android:versionCode」则是开发者用的内部版本号,一般使用流水号。

 <application android:icon="@drawable/icon" android:label="@string/app_name"> ... </application> 

「manifest」标签中主要包含一个「application」标签(备注1)。「application」标签里面,定​​义了所有这个应用程式用到的Activity、服务等资讯。「application」标签中的「android:icon」属性,定义了这个应用程式将显示在Android 主画面中的应用程式图示。「android:icon="@drawable/icon"」表示应用程式图示的资源档存在于「res/drawable/icon」 中。图示的大小必须超过64x64 像素(Pixel)。「application」标签中的「android:label」属性可用来指定应用程式将显示在Home 主画面上的名称​​。也就是预设刚开好机时,可以从桌面下方拉出的应用程式列表。

 <activity android:name=".Bmi" android:label="@string/app_name"> ... </activity> 

「application」标签中所有用到的Activity ,都要包含在一个个「activity」标签中(备注2)。Activity 是Android 应用程式与使用者互动的主要元素,当使用者开启一个应用程式,第一个看到的画面就是一个Activity。若是一个应用程式中包含多个画面时,会定义多个不同的Activity,我们也必须在「application」标签中,使用多个「activity」标签,为不同的Activity 添加描述。如果我们已经在程式码中定义好了Activity ,却忘了在「AndroidManifest.xml」档案中加入对应的「activity」标签,那么在执行中呼叫到这个Activity的时候,将无法开启这个Activity。

「activity」标签的「android:name」属性,指出了这个Activity 所对应的类别(class)。「activity」标签中的「android:label」属性可用来指定应用程式将显示在Activity 画面上方的名称。也可以在程式码中透过「setTitle(“名称”)」来动态修改。

因为在上一层「Manifest」标签属性中已经定义了「package="com.demo.android.bmi"」,因此在「activity」标签的「android:name」属性中,「.Bmi」代表着「com .demo.android.bmi.Bmi」的简写。也可以写成「Bmi」,一样是代表「com.demo.android.bmi.Bmi」这个类别。

 <intent-filter>   <action android:name="android.intent.action.MAIN" />   <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> 

「intent-filter」标签定义了这个「activity」的性质。「intent-filter」中主要包含了两个标签:「action」跟「category」标签。「action」标签中的「android:name」属性,其内容「android.intent.action.MAIN」表示:这个Activity 是此应用程式的进入点(就像程式中常见的main 主程式),开启这个应用程式时,应先执行这个Activity。常见的还有「android.intent.action.EDIT」等标签,会在之后章节用上的时候讲解。「category」标签中的「android:name」属性,其内容「android.intent.category.LAUNCHER」表示:这个Activity 将显示在Launcher 的应用程式列表中。

我们把整个档案合到一起看,可以总结出这个档案所传达的讯息:在「com.demo.android.bmi」路径下的「Bmi.java」这个档案中,已定义了一个主要的Activity; 当我们打​​开Android 的时候,显示的是位于「res/drawable/icon」的图示。一旦我们按下图示来启动这个应用程式,Android 应用程式框架会去寻找到定义了「android.intent.action.MAIN」内容的「.Bmi」activity,并呼叫执行。

 <uses-sdk android:minSdkVersion="X" /> 

Android SDK 1.1 版之后引入了这条叙述,「X」代表了目标版本代号。透过指定这个参数,系统可以依此辨别应用程式是否使用相容的SDK 版本,好决定能否在这台机器上安装执行。这也是一个可选填的选项。但如果我们的应用程式要发布出去,一些强势的通路如Google Android Market 已规定所有新发布的应用程式必须指定「android:minSdkVersion」这个参数。

各目标版本与代号对应表如下:

目标版本 代号
3.0 11
2.3.3 10
2.3 9
2.2 8
2.1 7
2.0.1 6
2.0 5
1.6 4
1.5 3
1.1 2
1.0 1

目前各版本占有率可以参考官方的版本占有率图表:http://developer.android.com/resources/dashboard/platform-versions.html

这个图表是根据最近2 周间连上Android Market 设备的比率来绘制。

备注1

除了「application」标签外,还有「uses-permission」(例如允不允许存取SMS、能否存取联络簿、相机功能)、「permission」、「instrumentation」等主要标签。 相关的内容在后续章节用到时再一并解说。

备注2

除了「activity」标签外,对应于Android 应用程式的运作流程,还有「service」、「receiver」、「provider」等主要元件。 相关内容会在后续章节提到时作解说。

参考资料

  • Android manifesthttp://developer.android.com/reference/android/R.styleable.html#AndroidManifest
  • Intent Actionhttp://developer.android.com/reference/android/content/Intent.html

更多相关文章

  1. Android中的数据绑定框架DataBinding(对比AngularJS双向数据绑定
  2. Svg标签跟学习
  3. Android 网络框架 Retrofit 源码解析
  4. Android 下拉刷新框架实现
  5. Android 自定义Html标签
  6. Android 开发资料总结--依赖注入框架
  7. MediaPlayer框架概述(一)

随机推荐

  1. PHP如何区分继承链中的$ this指针?
  2. 请问做PHP相关工作是不是基本都要懂前端
  3. php的冷门函数之——call_user_func_arra
  4. 快速使用数组的最近元素来确定新元素是否
  5. php中三种数据库的连接方式
  6. php是如何工作的
  7. Updating Checked Checkboxes using Code
  8. 换行符被替换为php中的rn
  9. imagecreatetruecolor()在symfony中不起作
  10. 写给系统管理员的 25 个 PHP 安全实践