四、清单文件

Android系统启动一个应用组件之前,系统必须通过应用的AndroidManifest.xml文件(清单文件manifest)知道组件是否存在。你的应用必须在这个文件中声明所有的组件,该文件必须放在应用工程的根目录下。

除了声明应用组件,manifest还完成很多功能,如:

  • 确定应用需要的用户权限,如互联网访问或访问用户联系人。
  • 声明应用需要最低 API 级别( API Level ),以此确定用户可以使用哪些 APIs
  • 声明应用使用或需要的硬件和软件特征,如照相机,蓝牙设备或多点触控屏。
  • 应用需要链接的 API 库(不仅是 Android 框架 APIs ),如谷歌地图库( Google Maps library )。
  • 其他更多信息。

声明组件

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属性指向应用图标资源。 
<activity>元素中,android:name属性指定彻底合格的Activity子类的类型,android:label属性指定一个字符串作为activity的用户可是标签(label)。 
你必须用下面的方式声明所有的应用组件: 
 l Activity<activity>元素 
 l Service<service>元素。 
 l Broadcast Receiver<receiver>元素。 
 l Content Provider<provider>元素 

对于源码中ActivityServiceContent Provider但没有在manifest文件中声明,系统是无法发现的,因此永远不见运行。然而,Broadcast Receiver即可以在manifest文件中声明,也可以在代码中动态创建(如BroadcastReceiver对象)并通过调用registerReceiver().在系统中注册。

更多的关于如何在应用中建立manifest文件,参加The AndroidManifest.xml File文档。

声明组件功能

正如激活组件部分所讨论,你可以使用Intent启动activityservicebroadcast receiver。你可以在Intent中明确的指明目标组件(使用组件类名)。然而,Intent真实的功能在于intent动作。利用intent动作,你只需声明想要完成的动作类型(你想要完成动作的数据,可选),然后允许系统去设备上寻找能够完成动作的组件启动它。如果有多个组件可以完成intent所说的动作,用户选择一个使用。

系统通过收到的intent与设备上其他应用的manifest文件中提供的intent filter(意图过滤器)之间的对比,识别能够响应Intent的组件。

当你在应用manifest文件中声明组件时,你可以随意地包含声明组件功能的intent filter,因此它可以响应来自其他应用的intent。你可以通过添加<intent-filter>元素为组件声明一个intent filter,作为组件声明元素的子集。

例如,Email App的撰写新邮件的activity可能在manifest中声明一个intent filter,来响应“发送”intent(为了发送email)。你应用中activity能够创建一个“发送”动作(ACTION_SEND)的intent,系统会把这个intentEmail App中的“发送”activity相匹配,当你用startActivity()调用intent时,启动它(activity)。

更多关于创建intent filter的信息,参加Intents and Intent Filters文档。

声明应用需求

这里有各种各样的Android支持的设备,不是所有的都提供相同的特征和功能。为了避免你的应用被安装在缺少需要的特征的设备上,在你的manifest文件中声明设备和软件需求,清楚的定义应用支持的设备类型是非常重要的。这些声明大多数只是信息性的,系统不会读取,但是外部服务如谷歌商店(Google Play)读取他们,为了给用户提供过滤器,当用户为他们应用搜索应用时。

例如,如果你的应用要求一个照相机并引用Android 2.1API 7),你应该在manifest文件中声明这些。这样,没有照相机的设备以及Android版本低于2.1不能从Google Play安装你的应用。

然而,你也可以声明应用使用照相机,但是不需要它。这种情况下,应用必须在运行时刻完成检查,决定设备是否有照相机,同时当它不可用时禁用所有使用照相机的特征。

这里是一些重要的设备特点,当你设计和开发应用时应该考虑他们:

屏幕尺寸和密度(density

为了通过屏幕类型对设备进行分类,Android为每二个设备定义了两个特征:屏幕大小(屏幕的物理尺寸)和屏幕密度(屏幕上像素的物理密度或者dpi——dot per inch每英寸点数)。为了简化不同类型屏幕的配置,Android系统概括他们为一些选定组,使他们更容易获取。

屏幕尺寸有:小(small),正常(normal),大(large)和超大(extra large)。

屏幕密度有:低密度(low density),中等密度(medium),高密度(high)和超高密度(extra high)。

默认地,你的应用适合所有屏幕尺寸和屏幕密度,这是由于Android系统对你的UI(用户界面)布局和图像资源做适当的调整。然而,你应该针对某一屏幕大小创建专门的布局以及针对某一屏幕密度提供专门的图像,使用可选择的布局资源,然后通过在manifest文件中定义<supports-screens>元素精确的声明应用支持哪些屏幕尺寸。

更多信息,参加Supporting Multiple Screens文档。

输入配置

很多设备提供不同类型的用户输入机制,如实体键盘,轨迹球,或者五个方向的导航键(five-way navigation pad)。如果你的应用需要特定的输入硬件,你应该在manifest文件中用<uses-configuration>元素声明。然而,应用需要特定输入配置是很少的。

设备特征

在支持Android的设备上,可能存在或不存在很多硬件和软件特征,如照相机,光传感器,蓝牙,特定版本的OpenGL,或者触摸屏精度。你从不能假设某一特征在所有Android设备上都可用(除了Android标准库的可用性),因此你应该用<uses-feature>元素声明应用使用的所有特征。

平台版本

不同设备经常运行不同版本的Android平台,如Android 1.6 Android 2.3。每个连续的版本经常包含之前版本不能用APIs。为了指出可用APIs集合,每,平台版本指定一个API级别(如,Android 1.0 API 1Android 2.3 API 9)。如果你使用任何在版本 1.0以后添加的APIs,你应该在<uses-sdk>元素中声明最小API级别。

为应用声明这些需求是很重要的,因为,当你在Google Play上发布应用时,商店使用这些声明来过来每个设备上哪些应用可用。正因如此,满足你应用需求的设备才能使用你的应用。

关于Google Play如何基于这些需求过滤应用,更多信息参加Filters on Google Play文档。

五、应用资源

一个Android应该并不仅有代码组成——它需要与代码分离的资源,如图像,音频文件,以及任何关于应该的视觉图像。例如,你应该用XML文件定义动画,菜单(menu),样式(style),颜色(color)以及UI Activity的布局(layout)。使用应用资源可以让你很容易更新程序特性,无需修改代码,只要提供供选择的资源——确保能够针对不同配置的设备优化应用。(不同语言和屏幕尺寸)。

Android工程中包含的每个资源,SDK定义了一个唯一的整数ID,从应用代码或者其他XML中定义的资源中可以通过ID引用资源。例如,如果你的应用有一个名叫logo.png(保存在/res/drawable/目录中)SDK产生一个叫做R.drawable.logo资源ID,你可以用它引用资源并插入到UI中。

把资源和代码分开的一个最重要的方面是可以为不同配置的设备选择不同的资源。例如,通过在XML中定义UI字符串(string),你可以翻译这些字符串为其他语言并在各自文件中保存这些字符串。然后,你可以附加一个语言限定符(qualifier)到资源目录(如res/values-fr/存储法语字符串值),基于这个目录和用户语言设置,Android系统在UI上使用合适的字符串。

Android为可选择的资源支持多种不同的限定符。限定符是一个包含资源目录短的字符串,是为了明确不同配置的设备应该使用哪种资源。同样的,你应该根据设备屏幕方向和尺寸为activity创建不同的布局。例如,当设备屏幕是竖放时(高),你应该需要带有垂直对齐的按钮布局,但是当屏幕横放时(宽),按钮应该水平对齐。为了根据方向改变布局,你应该定义两个不同的布局,并给每个布局目录名运用合适的限定符。然后,系统依据当前设备自动运用合适的布局。

关于应用中可以包含的不同资源以及如何为不同配置的设备创建可选择资源,更多线性参见Application Resources开发文档。

2012/9/15 朱锋

原文参加

Application Fundamentals | Android Developers

更多相关文章

  1. mono for android读书笔记之硬件编程
  2. android关于获取手机号
  3. Android(安卓)app如何正确读写系统sys设备节点
  4. Google 官方推出应用开发架构指南
  5. 常用Android开发组件之列表类组件
  6. 报告称Android和iOS设备正慢慢侵蚀PC市场
  7. android 中组件 service
  8. 彻底弄懂Activity的启动模式和任务栈
  9. 既然android service是运行在主线程中的,那service还有什么用?

随机推荐

  1. Android: Runtime.exec()的陷阱
  2. Android连接到加密网络
  3. Android(安卓)通知栏Notification 悬浮通
  4. android实现图片模糊背景效果
  5. android 怎样用代码设置墙纸
  6. Android如何导入已有的外部数据库
  7. android 版本及对应数值
  8. Android之CircleImageView
  9. android子线程创建handler
  10. android Volley 使用