Android官网学习笔记004:应用程序基本原理(03)

来源:互联网 发布:杨幂挑拨周迅赵薇 知乎 编辑:程序博客网 时间:2024/06/11 09:19

###################  声明部分  #####################

主要内容与来源:Google官网www.android.com

本人博客地址:http://blog.csdn.net/riverzhu

声明:由于本文档为阅读Google官网www.android.com的Dev. Guide内容,并结合个人理解与总结所形成的。因此,很多内容均受个人能力与水平限制,难免存在着各种不足与错误,希望各位朋友多多指出。同时,欢迎各位朋友在转载时保留“声明部分”。此外,英文中很多词汇直接译成中文将会引起误解,如Started Service、Bound Service等,均直接引用,而不作翻译。

联系方式:dr.river.zhu@gmail.com

################################################

 

清单文件(Manifest)

在Android系统能够启动一个应用程序组件之前,系统必须通过读取应用程序的AndroidManifest.xml文件(也即manifest文件)才能确定该组件是否存在。在manifest文件中,应用程序必须声明其所有的组件,这些组件必须存在于应用程序项目的根目录中。

除了声明应用程序的组件外,manifest还有其他作用,如:

  • 确定应用程序要求的任何用户权限,如网络访问、通讯录信息读取访问等。
  • 声明应用程序要求的最低API Level,应用程序使用基于该Level的API。
  • 声明应用程序使用或要求的硬件与软件特性,如摄像头、蓝牙服务、多点触屏。
  • 应用程序需要链接的API库(不是Android框架API),如Google Maps库
  • 其他等等


声明组件

manifest的主要任务之一是告知系统构成应用程序的组件信息。例如,一个manifest文件可对一个activity声明如下:

<?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属性指向用于标识应用程序的图标(icon)资源。

在<activity>元素中,android:name属性指明了Activity类的子类的完全限定类名(fully qualified class name),而android:label属性指明了activity中作为用户可视标签的字符串。

应用程序组件必须以如下方式声明:

  • <activity>元素用于Activity
  • <service>元素用于Service
  • <receiver>元素用于Broadcast Receiver(广播接收器)
  • <provider>元素用于Content Provider(内容提供器)

在应用程序的源文件中包含,但没有在manifest中声明的所有activity、service与content provider,对系统而言均不可见,因此这些组件将永远不会运行。然而,broadcast receiver既可以在manifest中声明,也可以在代码中动态创建(作为BroadcastReceiver对象)并通过调用registerReceiver()注册到系统中。

更多关于如何为应用程序构建manifest文件的信息,请参阅“AndroidManifest.xml文件”文档。


声明组件能力

如在“激活组件(Activating Components)”中所述,可以使用一个Intent对象启动activity、service和broadcast receiver。开发者可以在Intent对象中显式(explicit)指定目标组件的名称(使用组件类名)。然而,intent的真正强大之处在于intent action(intent脚本)的概念。通过intent action,开发者可以只须描述希望执行的动作类型(以及,该动作操作的数据),并允许系统在设备上查找一个可以执行该动作的组件,然后启动查找到的组件。若存在多个可完成intent所描述的动作的组件,则由用户选择决定使用哪个。

系统通过将接收到的intent与设备中其他应用程序的manifest文件中的intent filer(intent滤器)相比较的方式来识别响应intent的组件。

当在应用程序的manifest中声明一个组件时,开发者可选择包含intent filter。该intent filter声明了组件的能力,因此该组件可以对来自其他应用程序的intent进行响应。可以通过对组件声明元素增加<intent-filter>子元素来为组件声明intent filter。

例如,一个具有撰写新邮件activity的电子邮件程序可在其manifest入口中声明一个intent filter,以此来响应“send”intent(为了发送电子邮件)。然后,其他应用程序中的activity可以创建一个具有“send”动作(ACTION_SEND)的Intent对象,当使用该Intent对象调用startActivity()时,系统将该intent与电子邮件应用程序的“send”activity匹配,并启动电子邮件应用程序。

更多关于创建intent filter的信息,请参阅“intent与intent滤器”文档。


声明应用程序需求

采用Android的设备有多种类型,但不是所有的设备均提供相同的特性与功能。为了防止所开发的应用程序被安装到缺少所需特性的硬件设备上,一定要通过在manifest文件中声明设备及软件需求来明确定义应用程序支持的设备类型(的描述)。这些声明中的大部分仅具有信息性,系统并不去读取这些信息。但是,外部service(服务)却需要读取这些信息。例如,用户使用他们的设备搜索应用程序时,Android Market service将读取这些信息并为用户提供过滤功能。

例如,若应用程序要求摄像头,并使用Android2.1(API Level 7)中引入的API,则必须在manifest文件中声明这些需求。这样,不具有摄像头和Android版本低于2.1的设备将无法从Android Market上安装该应用程序。

然而,也可以声明应用程序使用摄像头,但不是强制需求。在这种情况下,应用程序必须在运行时执行检查,以便判断该设备是否具有摄像头,并进一步决定是否关闭一些跟摄像头相关的功能与特性。

开发与设计应用程序时需要考虑的重要的设备特性:

  • 屏幕尺寸与分辨率(Screen size and density)
为了通过屏幕类型对设备分类,Android针对每个设备定义两种特性:屏幕尺寸(屏幕的物理尺寸)与屏幕分辨率[screen density](屏幕的物理像素,或DPI——每英寸点数)。为了简化所有不同类型的屏幕配置,Android系统通过将它们泛化分组进而使得每个屏幕配置易于确定自己的归属分组。

注:[screen density]意译为屏幕细腻度、分辨率

  1. 屏幕尺寸:小small、正常normal、大large、特大extra large
  2. 屏幕分辨率:低分辨率low density、中分辨率medium density、高分辨率high density、 特高分辨率extra high density

默认情况下,由于Android系统对UI布局(layout)与图像资源进行了适当的调整,所开发的应用程序可兼容所有类型的屏幕尺寸与分辨率。然而,使用可供选择的布局(layout)资源,及通过在manifest文件中的<supports-screens>元素明确声明应用程序所支持的屏幕尺寸,开发者可对特定屏幕尺寸创建专用的布局(layout),同样,也可对特定的分辨率提供专用的图像。

更多信息,请参阅“多屏幕支持”文档。

  • 输入配置(Input configurations )

许多设备提供了不同类型的用户输入机械装置,如硬键盘、轨迹球、或五向导航按键。如果应用程序需要某种特定类型的硬件输入硬件,则应该在manifiest中的<uses-configuration>元素中声明。然而,一个应用程序一定需要某一特定输入配置的情况很少。

  • 设备特性(Device features )
在某个具体的Android设备中,并不一定具备所有的硬件或软件的特性,如摄像头、光感应器、蓝牙、某特定版本的OpenGL、或触屏保真度。从来都不应该假设所有的Android设备均具有某一特性(不同于标准Android库的可用性),所以开发者应该使用<uses-feature>元素声明应用程序所使用的任何设备特性。

  • 平台版本(Platform Version )

不同的Android设备常常运行不同版本的Android平台,如Android 1.6或Android 2.3。每个后继版本一般都会引入前一版本中没有的新增API。为了指明何组API可用,每个版本的平台均指明了一个API Level(如Android 1.0为API Level 1,而Android 2.3为API  Level 9)。如果使用了任何1.0版本之后的平台所新增的API,则必须使用<uses-sdk>元素声明引入这些API的最小API Level。

为应用程序声明所有类似的需求非常重要,因为当部署应用程序到Android Market时,Android Market将使用这些声明来过滤每个设备上的可用应用程序。就此而论,应用程序应该仅对满足应用程序所有需求的设备而言是可用的。

更多关于Android Market如何基于需求过滤应用程序的内容,请参阅“Market Filter”文档。


应用程序资源

一个应用程序不仅仅由代码构成,它还要求有与源代码相分离的资源(resource),如图像、声音文件和任何应用程序视觉显示相关的内容。例如,开发者应该使用XML文件定义动画、菜单、样式(style)、颜色及activity用户界面布局。通过提供一组可供应用程序选择的资源,无需修改代码即可轻松地更新应用程序的各种特性并可针对不同设备配置优化应用程序(如不同语言与屏幕尺寸)。

对于包含进Android项目中的每一个资源,SDK构建工具(build tools)均定义了一个唯一的整型ID。开发者可以在应用程序源代码中或XML中定义的其他资源内通过ID来引用该资源。例如,若应用程序包含一个名为logo.png的图像文件(存储在res/drawable/目录),SDK工具为该资源产生一个名为R.drawable.logo的资源ID。通过该ID,开发者可以在用户界面中引用或插入该图像。

将资源与源代码相分离最大的优势在于可根据不同设备配置选择不同的可替换资源(alternative resources)。例如,通过在XML文件中定义UI字符串,开发者可以将UI字符串译成其他语言,并保存这些字符串到一个单独的文件中。然后,根据附加到资源目录名上的语言修饰词(qualifier)(如res/values-fr/ 是法语字符串值)及用户语言设置,Android系统将适合的语言字符串应用到应用程序的UI界面。

Android支持可替换资源(alternative resources)的许多不同的修饰词(qualifier)。修饰词(qualifier)是一个包含在资源目录名中的短字符串,其目的是为适用于该资源的设备定义设备配置。再如,开发者总是应该根据设备屏幕的方向与尺寸来为activity创建不同的布局。如,当设备屏幕方向为纵向(高)时,可能会需要一个垂直排列按钮的布局,而当屏幕方向为横向(宽)时,则按钮应该水平排列。为了根据方向变换布局,开发者需要定义两个不同的布局,并将适当的qualifier应用于每个布局目录名。然后,系统会根据当前设备的方向自动地应用适合的布局。

更多关于可以包含到应用程序中的不同类型资源,及如何为不同设备配置创建可替换资源的信息,请参阅“应用程序资源开发者指南”文档。

应用程序基本原理(完)

原创粉丝点击