清单文件
在 Android 系统启动应用组件之前,系统必须通过读取应用的 AndroidManifest.xml文件(“清单”文件)确认组件存在. 我们的应用必须在清单文件中声明其所有的组件,清单文件必须位于应用项目目录的根目录中.
除了声明应用的组件外,清单文件还有许多其他作用,如:
-
确定应用需要的任何用户权限,如互联网访问权限或对用户联系人的读取权限
-
在使用Eclipse时,根据应用使用的API,声明应用所需的最低API级别(使用Android Studio,默认是在gradle文件里声明)
-
声明应用使用或需要的硬件和软件功能,如相机、蓝牙服务或多点触摸屏幕
-
声明应用需要链接的API库(Android框架API除外),如Google 地图库
声明组件
清单文件的主要任务是告知系统有关应用组件的信息.例如,清单文件可以像下面这样声明 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的用户可见标签的字符串.
我们必须通过以下方式声明所有应用组件:
-
<activity>
元素用来声明activities -
<service>
元素用来声明services -
<receiver>
元素用来声明broadcast
receivers -
<provider>
元素用来声明content
providers
我们写在源代码中,但未在清单文件中声明的activities,services和content providers对系统不可见,因此永远不会运行. 不过,broadcast receivers可以在清单文件中声明或在代码中动态创建(如BroadcastReceiver对象)并通过调用 registerReceiver()在系统中注册.
如需了解有关如何为应用构建清单文件的详细信息,请参阅
AndroidManifest.xml文件文档.
声明组件功能
如上文启动组件中所述,可以使用Intent来启动 activities,services和broadcast
receivers. 我们可以通过在intent中显式命名目标组件(使用组件类名)来执行此操作.或者通过隐式Intent来描述要执行的动作类型(还可选择描述想执行的动作所针对的数据),系统会将接收到的intent与设备上应用的清单文件中声明的意图过滤器进行比较,从而找到可执行该操作的组件,并启动该组件.如果有多个组件可以执行这个intent所描述的操作,则由用户选择使用哪一个组件.
如果使用Intent来启动一个Service,不要使用隐式意图,因为我们无法确定哪个service会响应这个intent,用户也看不到哪个service启动了.从Android 5.0(API 21)之后,如果用隐式意图调用了bindService()方法,会抛出一个异常.所以,在我们写services时,不要给我们的services声明意图过滤器.
当我们在应用的清单文件中声明一个activity时,可以添加一个<intent-filter>
元素作为组件声明元素的子项,作为声明Activity功能的意图过滤器以响应来自其他应用的
Intent.
例如,如果开发一个电子邮件应用,包含有一个用于撰写新电子邮件的activity,则可以像下面这样声明一个意图过滤器来响应“send”的intents(以发送新电子邮件):
<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动作的intent,并将其传递到startActivity(),则系统可能会启动上面声明的activity.
声明应用要求
基于Android系统的设备多种多样,并非所有设备都提供相同的特性和功能. 为防止将应用安装在缺少应用所需特性的设备上,必须在清单文件中声明对设备和软件要求,明确定义我们的应用所支持的设备类型.其中的大多数声明只是为了提供信息,系统不会读取它们,但像Google Play等外部服务会读取它们,当用户为他们的设备搜索应用时为用户提供过滤功能.
例如,如果我们的应用需要相机,并使用Android 2.1(API 7)中引入的API,就应该像下面这样在清单文件中以要求形式声明这些信息:
<manifest ... >
<uses-feature android:name="android.hardware.camera.any"
android:required="true" />
<uses-sdk android:minSdkVersion="7"
android:targetSdkVersion="19" />
...
</manifest>
现在,没有相机且Android 版本低于 2.1 的设备将无法从 Google
Play安装我们的应用.
不过,我们也可以声明我们的应用使用相机,但并不要求必须使用.在这种情况下,必须将required
属性设置为 "false",并在运行时检查设备是否具有相机,然后根据需要停用任何相机功能.
设备兼容性文档中提供了有关如何管理应用与不同设备兼容性的详细信息.
网友评论