Android API课程1.3: The Menifest File

在Android系统启动一个应用组件前,系统必须先通过阅读应用的AndroidManifest.xml("manifest"文件),才知道组件的存在。所以你的应用必须在manifest文件中声明所有组件,这个文件也必须在应用项目的根目录。

manifest除了声明组件外,还做了很多的事情,例如:

  • 定义应用需要的所有用户权限,比如Internet access(网络访问)和read-access(阅读)用户联系人的权限。
  • 声明应用需要的最小的API级别,这个级别是基于应用需要使用的APIs.
  • 声明应用需要的或者使用的硬件和软件功能。例如相机,蓝牙服务或者多点触摸。
  • 声明应用需要的Android framework APIs之外的API库。例如Google Maps library.
  • 等等

声明组件

manifest的主要任务是去告诉系统关于应用的组件。比如,一个manifest文件可以声明一个活动如下:

<? xml version = "1.0" encoding = "utf-8" ?>

<manifest ... >

<application android:icon = "@drawable/app_icon.png" ... >

<activity android:name = "com.example.project.ExampleActivity"

android:label = "@string/example_label" ... >

</activity>

...

</application>

</manifest>

在<application>元素中,android:icon属性指向图片资源以标识该应用。

在<activity>元素中,android:name属性指定一个合法的类名全称。这个类也是Activity的子类。android:label属性为活动指定一个用户可见的标签名。

你必须使用以下方式声明所有应用组件:

  • <activity> elements for activities
  • <service> elements for services
  • <receiver> elements for broadcast receivers
  • <provider> elements for content providers

在源文件定义的活动,服务和内容提供者,但是如果没有在manifest文件中声明,那么对于系统是不可见的,也绝不能运行。

然而,广播接收器可以在manifest中声明也可以在代码中(作为BroadcastReceiver对象)动态创建,并通过调用registerReceiver()注册到系统。

想要了解更多的关于manifest文件的结构,那么请阅读The AndroidManifest.xml File 文档。

声明组件能力

正如Activating Components文中讨论那样,你可以使用Intent去启动活动,服务和广播接收器。你可以在intent中明确命名目标组件。但是,intents真正强大地方在intent动作(action)的概念。有了intent动作,你可以简单地描述你想执行的动作类型,也可以添加你执行动作的数据。这就让系统可以找到设备上的空间并执行动作和启动它。如果有多个组件可以执行intent描述的动作,那么由用户选择使用哪个。

系统鉴别可以响应intent的组件方法是,通过对接收到的instent与设备上其他的应用的manifest文件中定义的intent过滤器(filter)进行比较得到。

当你在manifest文件中声明一个组件,你可以包含intent filter(可选的属性)来声明组件的能力以便它可以响应其他应用发送的intent.你可以通过添加<intent-filter>标签来声明一个intent filter元素。这个元素作为组件的一个子元素。

例如,一个邮件应用有一个写邮件的活动,这个活动可能在manifest文件声明一个intent filter可以响应“send”intent(可以发送邮件)。那么你应用的一个活动可以创建一个有“send”动作(ACTION_SEND)的intent。当你调用这个intent的startActivity()时,系统就会匹配到邮件应用的“发送”活动并启动它。

参考Intents and Intent Filters文档了解更多关于创建intent filters的知识。

声明应用需求

有很多的Android设备,但是并不是所有的设备都有相同的功能和能力。为了防止你的应用安装到缺少你应用依赖的(不兼容的)设备上去,那么清楚地在manife文件中定义一个profile(描述),描述你需要的设备和软件信息就变的重要了。大多数声明只是信息,系统不会去阅读它们。但是,外部的服务例如Google Play确实通过阅读他们来向用户提供过滤适合安装在他们设备上的应用。

例如,如果你的应用需要相机和在Android2.1中的APIs,你应该要在manifest文件中声明这些需求。这种情况下,没有相机或者Android版本地与2.1的设备就不会从Google Play中安装你的应用。

然后,你也可以声明你的应用使用相机,但是并不是必需的。这种情况下,你的应用必须在运行中执行检查是否该设备有相机,并禁止相机功能如果没有的相机的话。

这里有一些重要的设备特征需要在你的设计和开发中考虑的。

屏幕尺寸和密度

通过屏幕类型来分类设备,Android定义了两个特征: 屏幕尺寸(屏幕的物理尺寸)和屏幕密度(像素的物理密度,dpi-dots 每英寸)。为了简单的定义所有不同类型的屏幕配置,Android系统推广他们的概念来让他们更加容易被分组。

屏幕的尺寸包含:小,普通,大,非常大。

屏幕的密度是:低密度,中等,高密度,非常高密度。

 

默认情况下,你的应用是兼容所有的屏幕尺寸和密度的。因为Android系统会给你的UI分布和图片适当的调整。但是,你应该为确定的屏幕尺寸创建精确的布局,和为确定的密度提供精确的图片。使用可变的布局资源,和通过在你的manifest文件中使用<supports-screen>标签声明你的应用支持的精确的尺寸。

 

参考Supporting Multiple Screens文档了解更多。

 

输入配置

许多设备提供不同的不同类型的用户输入机制,比如物理键盘,一个追踪球,或者5个方式导航板。如果你的应用需要一个特定类型的输入硬件,那么你应该在manifest中是用<uses-configuration>标签声明。然而,它是很少见的。

 

设备功能

一个Android的设备可能有许多的硬件和软件功能,比如相机,光感器,蓝牙,确定版本的OpenGL和精确的触摸屏。你应该不要假设Android设备包含某个Android标准库之外的功能。因此你应该在你的应用中使用<uses-feature>标签标识你需要使用的功能。

 

平台版本

不同的Android设备通常会运行不同版本的Android平台。例如 Android1.6或者2.3. 每种成功的版本都会有额外API不能在之前的版本使用。为了标识那种API集是可用的,每个平台版本都有对应的API级数。例如,Android1.0的API级数是1,Android2.3的API级数为9。如果你要使用任何在Version1.0后面的APIs,那么你就需要使用<uses-sdk>标签声明最小的API级别。

声明你的应用的需求是很重要的。因为,当你发布你的应用到Google Play,这个商店使用这些声明去过滤那些应用是可以被使用在什么样的设备上。同时,你的应用应该只能被那些满足你应用需求的设备上。

参考Filters On Google Play 文档了解更多的关于Google Play怎么基于需求过滤应用的知识。

猜你喜欢

转载自woothon.iteye.com/blog/1749498