Android应用程序基础(二)

来源:互联网 发布:java入门的好书 编辑:程序博客网 时间:2024/05/01 12:38

Android系统启动应用程序的组件之前,必须通过其清单文件(AndroidManifest.xml)获知该组件的存在。应用程序必须在这个文件中声明所有的组件,并且把这个文件放置在应用程序项目的根目录里。

除了声明应用程序的组件外,清单文件还做了至少以下事情:

  • 确定应用程序需要的任何用户权限,例如网路访问权限或联系人访问权限等。
  • 基于应用程序使用的API等级,声明应用程序需要的最小API等级。
  • 声明应用程序需要或使用的硬件或软件特性,例如相机、蓝牙服务或者多点触控屏幕。
  • 除了Android应用框架的API,应用程序需要链接的API库,例如Google地图库等。

声明组件

清单文件的基本用途是向Android系统通报该应用程序包含的组件。例如,配置文件可以以下面的方式声明活动:

<?xml version="1.0" ecoding="utf-8"?><manifest ...>    <application android:icon="@drawable/app_icon.png"...>        <activity android:name="com.example.project.ExampleActivity"                  android:label="@string/example_label"...>         </activty>         ...     </application></manifest>

<application>元素中,android:icon属性指向作为应用程序图标的资源。在<activity>元素中,android:name属性制定Activity子类的合法的类名全称,android:label属性指定一个字符串作为该活动的用户可见的标签。

以以下方式声明所有的应用程序组件:

  • <activity>元素声明活动
  • <service>元素声明服务
  • <receiver>元素声明广播接收者
  • <provider>元素声明内容提供者

包含在源文件里却未在清单文件中声明的活动、服务和内容提供者对系统不可见,因此不会运行。然而,广播接收者可以在清单文件中声明,也可以在代码中动态创建(BroadcastReceiver对象)并通过registerReceiver()方法向系统注册。

声明组件能力

如在启动组件一节中所述,可以使用意图启动活动、服务和广播接收者。可以在意图中明确地指明目标组件(使用组件类名)。然而,意图的真实的强大之处在于隐式意图的概念。隐式意图简单地描述执行动作的类型(和可选的,该动作处理的数据),允许系统在设备上寻找一个执行该行为的组件并启动它。如果有多个组件可以执行意图描述的活动,由用户选择使用哪一个。

系统识别可响应意图的组件的方式是通过比较接收到的意图和在设备上的其他应用程序的清单文件中提供的意图过滤器(Intent Filter)。

当在应用程序的清单文件中声明一个活动时,可选择为该活动设置意图过滤器来声明该活动的能力,以响应来自其他应用程序的意图。可以通过在清单文件中为组件的声明元素添加<intent-filter>子元素的方法为组件声明意图过滤器。

例如如果构建了一个电子邮件应用程序来编辑邮件的活动,那么可以为它声明一个意图过滤器来响应“发送”意图(为了发送一封电子邮件):

<manifest ...>  ...    <application ...>      <activity android:name="com.example.project.ComposeEmailActivity">        <intent-filter>          <action android:name="android.intent.action.SEND" />          <data android:type="*/*"/>          <category android:name="android.intent.category.DEFAULT"/>         </intent-filter>       </activity>     </application>   </manifest>

然后,如果另一个应用程序创建了一个要求ACTION_SEND动作的意图,并把它传给startActivity,那么系统可以启动这个活动并且发送电子邮件。

声明应用程序属性

有多种多样使用Android系统的设备并且它们并不是每一个都提供了相同的特性和能力。为了阻止将应用程序安装在没有它依赖的特性的设备上,需要在清单文件中声明应用程序需要的设备或软件需求。大部分的声明只是信息性的,系统并不读取它们,而是由外部的服务例如Google Play读取。在用户在他们的设备上搜索应用时,Google Play根据这些信息过滤掉不支持该设备的应用程序。

<manifest ...>  <uses-feature android:name="android.hardware.camera.any"                android:requried="true"/>   <uses-sdk android:minSdkVersion="7" androidtargetSdkVersion="19"/>   ...</manifest>

现在,那些没有相机和Android版本低于2.1的设备都不能够从Google Play上安装这个应用程序。

然而,也可以声明应用程序使用相机,但不需要它。在这种情况下,应用程序设置android:required属性为false,并且在运行过程中检测设备是否具有相机,以在适当的时候禁用任何相机特性。

应用程序资源

Android应用程序并不只是由代码组成,它也需要与源代码分离的资源,例如图像、音频文件和其他与应用程序的可视化表现有关的任何东西。例如,可以使用XML文件为活动的用户界面定义动画、菜单、样式、颜色和布局。使用应用程序资源使得应用程序可以在不修改代码的情况下非常容易地更新多种多样的特性。并且可以通过提供可供选择的资源组能够使应用程序根据设备配置(例如屏幕尺寸和语言)获得优化。

对于任何一个包含在Android项目的资源,SDK构建工具为它定义了一个唯一的整数ID,可以使用这个ID在应用程序代码或者其他以XML格式定义的资源引用该资源。例如应用程序如果包含一个叫做logo.png的图片文件(保存在layout/drawable/目录下),SDK工具为其生成名为R.drawable.logo的资源ID,可以利用这个ID来引用这个图像并把它插入到用户界面中。

资源和代码分离的最重要的方面之一是可以为不同的设备配置提供不同的资源。例如,通过使用XML定义一组UI字符串值,将这些字符翻译成其他语言并保存在不同的文件中。然后通过加在资源目录名后的语言限定符(例如存放法语字符串值的res/values-fr/)和用户的语言设置,Android系统为用户界面选择适当的字符串。

Android为供选择的资源提供很多不同的限定符。限定符是添加到资源目录名称后的一个短字符串,以定义这些资源适用的设备配置。看另一个例子,应该根据屏幕方向和尺寸为活动创建不同的布局。例如,当设备屏幕在纵向模式时,可能需要一个按钮垂直排列的布局,但当屏幕横向时,按钮应则该水平排列。为了根据不同的方向改变布局,可以定义两个不同的布局并且给每个布局的目录名后添加适当的限定符。这样,系统就根据当前设备方向自动应用合适的布局。

0 0