首页 > 代码库 > Intent 和 Intent Filter简介

Intent 和 Intent Filter简介

Intent 和 Intent Filter

Intent 是一个消息对象,你可以用它向另一个 app 组件发生动作请求。尽管 Intent 在促进组件间沟通的方式有多种,主要有个以下三种基本方式:

1.启动一个 Activity:

一个 Activity 代表 app 中一个单独的 screen。你可以通过为 startActivity() 方法传入一个 Intent 对象来启动一个 Activity 对象。Intent 描述要启动的 Activity, 并携带该 activity 启动所必须的数据。

如果你希望在一个 activity 结束时受到它返回的结果, 可以调用 startActivityForResult(). 你的 activity 将会在 onActivityResult() 的回调方法中收到另一个 Intent 对象,其中包含返回的数据。

2.开始一个 service:

Service 是一个在后台运行的、没有用户接口的组件。可以通过为 startService() 方法传入一个 Intent 对象来启动一个一次性有效的 service (如下载一个文件)。 Intent 描述要启动的 Service,并携带启动该 service 所必须的数据。

3.传递一个广播:

广播就是所有 app 都能接收到的消息。系统会传递各种各样的系统事件广播,如当系统开机或设备开始冲动时。你可以通过传入一个 Intent 到 sendBroadcast(), sendOrderedBroadcast() , 或 sendStickyBroadcast() 方法中来传递一个广播到到其他的 app。

Intent 的类型

有两种类型的 Intent:

明确的 Intent:通过名称(类的完整名称)来指定要启动的组件。通常会用明确的 Intent 来启动自己 app 中的一个组件,因为你指导要启动的 activity 或 service的完整名称。例如,启动一个新的 activity 来响应用户操作,或在后台启动一个 service来下载一个文件。

不明确的 Intent:不需要指定组件的名称,但是要声明一个要执行的动作,可以让其它 app 中的一个组件来处理它。例如,你想要向用户显示地图上的一个位置,你可以请求另一个可用的 app 来显示地图上指定的位置。

如果你创建了一个明确的 Intent 来启动一个 activity 或 service, 系统会立刻启动 Intent 中指定的 app 组件。

如果你创建了一个不明确的 Intent,Android 系统会通过比较设备上其他app中的 Intent 在 manifest 文件中声明的 intent filter 来找到适合的组件。如果该 Intent 匹配一个 intent filter, 系统将会启动这个组件,并将该 Intent 对象传递给它。 如果有多个 intent filter 匹配,系统就会展示一个对话框来让用户选择要使用哪个 app。就像下图显示的这样:

Intent Filter

Intent Filter 就是在 app 的 manifest 文件中声明的一个表达式,它用于指定该组件可以接收的 Intent 的类型。例如,你要为一个 activity 指定一个 Intent filter,使其他应用可以直接通过某种类型的 Intent 来启动你的 activity。同样,如果你不为这个 activity 指定任何 Intent Filter, 那么只能通过明确的 Intent 来启动它。

注意:为保证你的应用程序的安全性,要用 明确的 Intent 来启动一个服务,并且不要给你的 services 声明任何 Intent filter。用一个不明确的 Intent 来启动一个 service 是不安全的,因为你不确定那个 service 将会响应这个 Intent, 并且,用户也看不到哪个服务被启动了。

 

下图演示了一个不明确的 Intent 如何在系统中传递,并启动另外一个 activity:

【1】 Activity A 创建了一个包含一个动作描述的 Intent 对象,并将其传递给 startActivity()

【2】 系统遍历所有应用,以查找匹配该 Intent 的 Intent filter。当找到一个一个匹配项时

【3】 系统就启动这个匹配的 activity (Activity B),通过调用它的 onCreate() 方法,并传入这个Intent 对象。