Android应用程序基础(Application Fundamentals)之二

前一篇: http://my.oschina.net/allenyao/blog/106669

Android应用程序基础(Application Fundamentals)之二:The Manifest File

清单文件(Manifest文件)

在Android系统启动一个应用程序组件之前,系统必须通过读取应用程序的AndroidManifest.xml文件来确定该组件是否存在。应用程序必须在这个文件中声明其所有的组件,而且这个文件必须在应用程序工程目录的根目录下。

除了声明应用程序的组件之外,清单文件还要做许多事情。例如:

  • 确定所有应用程序所需要的用户权限,如互联网访问或者读取用户的联系人信息。
  • 声明应用程序所需要的最低API级别,这取决于应用程序使用了哪里API。
  • 声明应用程序所用到的或者要求的硬件和软件功能,如相机,蓝牙服务,或者多点触摸屏。
  • 应用程序所需要链接的API库(除了Android框架的API),如Google Maps library。
  • 其他更多事情。

声明组件

清单文件的主要任务是通知系统,应用程序都有哪些组件。例如,一个清单文件可以像下面这样声明一个活动:

<?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>元素用来定义活动
  • <service>元素用来定义服务
  • <receiver>元素用来定义广播接收者
  • <provider>元素用来定义内容提供者

对于活动,服务以及内容提供者,如果你包含在代码里了,却没有在清单文件中声明,那么对于系统而言就是不可见的。

 

声明组件功能(Declaring component capabilities)

正如上面所讨论的,在激活的组件,您可以使用一个意图开始活动、服务、广播接收器。你可以通过显式命名目标组件(使用组件类名称)的意图。然而,真正的权力的意图在于意图行动的概念。有目的的行动,只需描述类型的行动你想执行(和可选的,数据在你想执行行动),并允许系统来找到一个组件的装置,它可以执行的行动和启动它。如果有多个组件,这些组件可以执行动作描述的意图,然后用户选择使用哪一个。

系统的识别组件,这些组件可以回复一个意图是通过比较接收到的目的意图过滤器在manifest文件中提供的其他应用程序在设备上。

当你 在应用程序清单中 声明一个组件时,你可以选择性地添加intent filter,以声明该组件的功能。这样,它就可以响应来自于其他应用程序的intent。通过在组件声明元素的下面添加<intent-filter>元素,你可以为组件声明一个intent filter。

例如,一个电子邮件应用程序,有一个用于发送电子邮件的活动(activity)。那么,它就可以在它的清单文件里声明一个intent filter,以响应“send”(为了发送邮件)。在你的应用程序里,可以为一个活动创建一个intent,绑定上“send”(ACTION_SEND)。当你通过startActivity()来调用这个intent时,系统就会匹配上电子邮件应用程序中的“send”活动,并启动它。

更多关于创建intent filter的信息,请查看Intents and Intent Filters文档。

声明应用程序的需求(Declaring application requirements)

安卓系统支持各种各样的设备。这些设备所能提供特性和功能也各不相同。为了避免你的应用程序被安装到缺乏要求功能支持的设备上。你必须通过在清单文件中声明设备和软件的要求,清楚地定义出你的应用程序所支持的设备类型。大多数这类声明只是一种信息,系统也不去读他们。但是,像Google Play这样的外部服务会读取这些信息,以方便用户从设备上搜索应用程序时进行过滤。

例如,如果您的应用程序需要一个相机功能,并且使用了在Android 2.1(API 7级)中引入的API,那么你就应该在清单文件中声明这些要求。这样,那些没有相机功能的设备,Android版本低于2.1的,就不能从Google Play中安装你的应用程序。

当然,你也可以声明你的应用程序会使用相机功能,但是不是强制要求它。在这种情况下,你的应用程序必须在运行时进行检查,以确定该设备是否有相机功能。如果相机功能不可用的话,就禁用某些特性。
 
当设计和开发应用程序时,你应该考虑以下这些重要的设备特点:
(1)屏幕大小和密度
    为了通过屏幕类型来对设备进行分类,Android为每个设备定义了两个特征:屏幕尺寸(屏幕的物理尺寸)和屏幕密度(屏幕上像素点的物理密度,或每英寸dpi点数)。为了简化不同类型屏幕的配置,Android系统划分了几个组,以让他们更容易被识别。
    屏幕尺寸分为:小(small),正常的(normal),大(large)和超大(extra large)。
    屏幕密度分为:低密度(low density)、中密度(medium density)、高密度(high density)和超高密度(extra high density)。
    默认情况下,你的应用程序是可以兼容所有屏幕大小和密度的。因为,安卓系统对你的UI布局和图像资源作了适当调整。然而,你应该使用可替代的布局资源,来为某些屏幕大小创建专门的布局,针对某些密度提供专门的图像,通过<supports-screens>元素,在清单文件中声明到底你的应用程序支持哪些屏幕尺寸。
    有关更多信息,请参见文档Supporting Multiple Screens。
(2)输入配置
    许多设备提供一个不同类型的用户输入机制,如硬件键盘、轨迹球、或五向导航板。如果你的应用程序需要一种特殊的输入硬件,那么你应该在清单文件中使用<uses-configuration>元素进行声明。当然,一个应用程序需要一个特定的输入配置是比较罕见的情况。
(3)装置特性
    有很多硬件和软件特性,在 一个给定的安卓设备 可能存在,也不可能不存在,如摄像头、一个光传感器、蓝牙、某个版本的OpenGL,或富达的触摸屏。你永远不应该假定一个特定的功能在所有的安卓设备都可用(除了Android标准库),所以你应该使用 <uses-feature>元素来声明你 的应用程序使用到的任何特性。
(4)平台版本
    不同的安卓设备运行的Android版本各不相同,比如Android 1.6或Android 2.3。Android的每个后续版本通常会包含一些先前版本所不支持的额外API。为了表明哪组API是可用的,每个平台版本都指定了一个API级别(例如,Android 1.0的API级别是1,Android 2.3的API级别是9)。如果你使用了任何Android 1.0之后添加的API,你就应该使用<uses-sdk>元素来声明最低API级别。
当你在Google Play上发布你的应用程序时,声明应用程序的全部需求是很重要的。应用程序商店使用这些声明来对每个设备上可以使用的应用程序进行过滤。这样,你的应用程序应该只提供给那些满足了所有的应用程序需求的设备。
更多关于Google Play如何过滤应用程序的信息,请查看Filters on Google Play文档。
应用程序资源
Android应用程序是由不仅仅是代码它需要资源,分离的源代码,如图片、音频文件和任何相关的应用程序的可视化表示。例如,你应该定义动画、菜单、样式、颜色和布局的活动用户界面与XML文件。使用应用程序资源使它容易更新您的应用程序的各种特点,无需修改代码和通过提供集替代资源让你优化你的应用各种设备配置(如不同的语言和屏幕大小)。
对于每个资源,你包括你的Android项目,SDK构建工具定义一个唯一的整数ID,您可以使用它来参考资源从您的应用程序代码或从其他资源定义在XML。例如,如果您的应用程序包含一个图像文件命名为标志。png(保存在res /绘图/目录),SDK工具生成一个名为r可拉的资源ID。标志,您可以使用它来参考图像和插入它在你的用户界面。
最重要的一个方面提供资源独立于你的源代码的能力为您提供替代资源为不同的设备配置。例如,通过定义UI字符串在XML,您可以翻译成其他语言的字符串,这些字符串保存在单独的文件中。然后,基于语言限定符,您添加到资源目录的名称(如res /价值观fr /法语字符串值)和用户的语言设置,Android系统运用适当的语言字符串到你的UI。
Android支持许多不同的限定符对你的替代资源。这个限定符是一个短的字符串包含在资源目录的名称来定义设备配置,应该使用这些资源。另一个例子是,你应该经常对你的活动创建不同的布局,这取决于设备的屏幕的方向和大小。例如,当设备屏幕在肖像取向(高),您可能想要一个布局与按钮是垂直的,但当屏幕在横向(宽),按钮应该水平对齐。改变布局根据定位,您可以定义两个不同的布局和应用适当的限定符,每个布局的目录名称。然后,系统会自动应用适当的布局根据当前设备的方向。

更多关于不同种类的资源可以包括在您的应用程序,以及如何创建替代资源为各种设备的配置,请参阅应用程序资源开发者指南。
 

你可能感兴趣的:(android,基础,入门,笔记,Manifest)