当 Android 启动一个应用程序组件之前,它必须知道那个组件是存在的。所以,应用程序会在一个 manifest 文件中声明它的组件,这个文件会被打包到 Android 包中。这个 .apk 文件还将涵括应用程序的代码、文件以及其它资源。
这个 manifest 文件以 XML 作为结构格式,而且对于所有应用程序,都叫做 AndroidManifest.xml。为声明一个应用程序组件,它还会做很多额外工作,比如指明应用程序所需链接到的库的名称(除了默认的 Android 库之外)以及声明应用程序期望获得的各种权限。
但manifest文件的主要功能仍然是向 Android 声明应用程序的组件。举例说明,一个 activity 可以如下声明:
<?xml version="1.0" encoding="utf-8"?>
<manifest . . . >
<application . . . >
<activity android:name="com.example.project.FreneticActivity"
android:icon="@drawable/small_pic.png"
android:label="@string/freneticLabel"
. . . >
</activity>
. . .
</application>
</manifest>
<activity> 元素的 name 属性指定了实现了这个 activity 的 Activity 的子类。icon 和 label 属性指向了包含展示给用户的此 activity 的图标和标签的资源文件。
其它组件也以类似的方法声明 ── <service> 元素用于声明服务, <receiver> 元素用于声明广播接收器,而 <provider> 元素用于声明内容提供者。 manifest 文件中未进行声明的 activity、服务以及内容提供者将不为系统所见,从而也就不会被运行。然而,广播接收器既可以在 manifest 文件中声明,也可以在代码中进行动态的创建,并以调用 Context.registerReceiver() 的方式注册至系统。
过滤器
Intent 对象可以被显式的指定目标组件。如果进行了这种指定,Android 会找到这个组件(依据 manifest 文件中的声明)并激活它。但如果 Intent 没有进行显式的指定,Android 就必须为它找到对于 intent 来说最合适的组件。这个过程是通过比较 Intent 对象和所有可能对象的 intent过滤器 完成的。组件的 intent 过滤器会告知 Android 它所能处理的 intent 类型。如同其它相对于组件很重要的信息一样,这些是在 manifest 文件中进行声明的。这里是上面实例的一个扩展,其中加入了针对 activity 的两个 intent 过滤器声明:
<?xml version="1.0" encoding="utf-8"?>
<manifest . . . >
<application . . . >
<activity android:name="com.example.project.FreneticActivity"
android:icon="@drawable/small_pic.png"
android:label="@string/freneticLabel"
. . . >
<intent-filter . . . >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter . . . >
<action android:name="com.example.project.BOUNCE" />
<data android:type="image/jpeg" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
. . .
</application>
</manifest>
示例中的第一个过滤器 ── action “android.intent.action.MAIN”和类别“android.intent.category.LAUNCHER”的组合──是通常具有的。它标明了这个 activity 将在应用程序加载器中显示,就是用户在设备上看到的可供加载的应用程序列表。换句话说,这个 activity 是应用程序的入口,是用户选择运行这个应用程序后所见到的第一个 activity。
第二个过滤器声明了这个 activity 能被赋予一种特定类型的数据。
组件可以拥有任意数量的 intent 过滤器,每个都会声明一系列不同的能力。如果它没有包含任何过滤器,它将只能被显式声明了目标组件名称的 intent 激活。
对于在代码中创建并注册的广播接收器来说,intent 过滤器将被直接以 IntentFilter 对象实例化。其它过滤器则在 manifest 文件中设置。