Intents and Intent Filters --2.1

来源:互联网 发布:萧山网络问政供电局 编辑:程序博客网 时间:2024/06/06 18:39

Intent 是一个消息对象,你可以通过它向其他应用程序传递 Action 。尽管 Intent 有很多方法可以帮助应用组件通信,但是基础用法只有下面的几种:

1.To start an activity:

在应用程序中,一个 Activity 代表了一个界面(UI)。你可以通过向 startActivity() 函数传递 Intent 启动一个 Activity。这个被传递的 Intent 带有目标 Activity 的信息和目标 Activity 需要用的数据。

如果你想在目标 Activity 结束的时候接受到从目标 Activity 返回的数据,那么你可以调用 startActivityForResult() 函数启动 Activity。这样之后,当目标 Activity 结束时,你的 Activity 就会在 onActivityResult() 函数中接受到来自目标 Activity 的 Intent 对象。

2.To start a service:

Service 是一个在后台执行操作的应用组件。你可以通过向 startService() 函数中传递 Intent 启动 Service 执行 one-time(一次性) 操作。这个被传递的 Intent 带有目标 Service 的信息和目标 Service 需要用的数据。

如果你想以 client-server 的形式启动 Service,那么你可以通过向 bindService() 函数传递 Intent 实现来实现,这样之后,其他组件就可以绑定到这个 Service 了。

3.To deliver a broadcast:

广播是一个任何应用程序都可以接收的消息对象。Android 系统将为系统事件发送各种广播,例如当系统启动完成,或者设备开始充电。你可以通过向 sendBroadcast()、 sendOrderedBroadcast()、 或者 sendStickyBroadcast() 传递Intent 对象来发送一个广播到其他应用程序。

1.Intent Types

有两种类型的 Intent :

1.Explicit intents

显式意图通过限定名指定了目标组件。通常情况下,如果在你自己的应用程序里面,你可以利用显式意图启动组件,因为你知道目标组件的名称。例如:为了响应用户的某个操作启动一个新的 Activity 或者启动一个 Service 在后台下载文件。

2.Implicit intents

隐式意图并不指定目标组件的名称,取而代之的是:它声明一个需要执行的 action,这个 action 允许其他应用程序处理。例如:如果你的应用程序想要在地图里面展示当前位置,你可以通过隐式意图发送一个请求,然后设备上的任何一个可以展示地图的应用程序都回响应这个隐式意图。

准备吃饭啦,晚上再接着写吧,下午还要打球呢~

哎呀唉呀,这个周期拉的有点长啊,哈哈~刚看了下,这片文章是 2016-3-26 写的,而今天是 2016-4-10,再过一天就半个月了,没办法呀,最近公司事有点多,再加上放假,然后再过几天科比就退役了,无心写东西啊~

但是想到,连一场老科的比赛都没有看上,整个人就有动力了!!!加油吧,骚年,趁年轻,多试错~

好了,不扯了,下面接着上面的进行翻译:

当你通过显式意图启动 Activity 或者 Service 的时候,系统将立即启动 Intent 指定的组件。

当你通过隐式意图启动组件的时候,系统将会通过比较 Intent 和当前设备上所有应用程序的清单文件中的所有组件的 Intent Filter 来决定启动哪个组件。如果 Intent 和 Intent Filter 匹配,系统将会启动对应的组件并将 Intent 对象传递给它。如果有多个 Intent Filter 都匹配这个 Intent,那么系统将会弹出一个对话框,由用户决定启用哪个应用程序。

Intent Filter 是一个在清单文件中声明的短语,它的主要作用是:声明这个组件可以接收什么类型的 Intent。例如:为了可以让其他应用程序可以直接启动你的 Activity,你可以为这个 Activity 声明一个 Intent Filter。同理,如果你没有为 Activity 声明 Intent Filter,那么它只能被显示意图启动。

这里写图片描述

上面的图片展示了:隐式意图是如何启动 Activity 的。[1]Activity A 创建一个隐式意图并将它传递给 startActivity() 函数。[2] Android 系统在当前设备上查询可以匹配当前 Intent 的组件。当有组件匹配时,[3]系统通过调用匹配组件(Activity B)的onCreate()函数启动目标组件,并将 Intent 传递进来。

注意:为了确保应用程序的安全性,通常情况下,在启动 Service 的时候,都要用显式意图,并且不要为 Service 声明 Intent Filter。利用隐式意图启动 Service 是有风险的,因为你不知道将会启动什么 Service,而且用户看不到哪个 Service 被启动了。自从 Android 5.0 开始,如果你通过隐式意图调用 bindService() 函数,那么系统将会抛出异常。

2.Building an Intent

一个 Intent 对象携带了 Android 系统用来判断启动哪个组件的信息和“接收者”完成某些 Action 需要的数据信息。

Intent 中包含的主要信息有:

1.Component name

需要启动组件的名称。

这是一个可选项,但是对于定义显式意图它确是十分有必要的,也就是说:当你通过显式意图启动组件时,系统将会根据组件名来决定启动哪个组件。如果在创建 Intent 时,没有为它指定组件名,系统将会根据 Intent 中的其他信息决定启动哪个组件。因此,如果你想在自己的应用程序里启动特定组件,那么在创建 Intent 时就应该指定组件名。

注意:当启动一个 Service 的时候,你应该指定组件名。否则,你不能确定哪个 Service 将会响应你的 Intent,而且用户无法看到哪个 Service 被启动了。

在 Intent 中,这个字段(Component name)是个 ComponentName 对象,在指定它的时候,通常都带上应用程序的包名,例如: com.example.ExampleActivity。你可以通过调用 setComponent()setClass()setClassName(),或者 Intent 的构造函数指定组件名。

2.Action

一个 String 指定了通用的 Action。

当通过 Intent 启动广播的时候,Action 指定的发生地点就是广播被发出的地点(In the case of a broadcast intent, this is the action that took place and is being reported)。Action 在很大程度上决定了 Intent 中其他参数是如何创建的——尤其 data 和 extras 中包含的数据。

在你自己的应用程序中,你可以为 Intent 指定自定义的 Action,但是通常情况下,你应该用 Android 系统定义的一些常量。这里有两个常用的 Action:

ACTION_VIEW

当你需要为用户展示一些信息的时候可以调用 startActivity() 函数,例如:在画廊应用中展示图片或者在地图应用中展示地址信息。

ACTION_SEND

当你希望用户通过其他应用程序分享当前内容时,可以为 Intent 中的 Action 指定这个类型。

想要了解更多关于 Action 常量的信息可以查看 Intent 类,同时在 Android 框架层也定义了一些常量,例如:在 Settings 中,定义了打开 Settings 相关界面的 Action。

你可以通过调用 setAction() 或者 Intent 的构造函数来为 Intent 指定 Action。

如果你自定义了 Action,记得在 Action 最前面加上应用程序包名,例如:

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";

3.Data

URI(统一资源标示符) 指定了被操作的数据或者数据的类型。数据类型通常是由 Action 决定的。例如:如果 Action 是 ACTION_EDIT 那么 data 指定的 URI 便是将被编辑的文档。

在创建 Intent 对象时,除了指定 URI 之外,指定 Data 的类型也是十分重要的。例如:一个 Activity 可以展示图片但可能不能展示音频文件。因此,指定 Data 的 MIME 类型将有助于 Android 系统确定将被打开的组件。然而,Data 的 MIME 类型通常是由 URI 决定的,尤其当一个数据是 content:URI 时,此时就表明:数据保存在当前设备上,并且由 ContentProvider 确定,也就是说 MIME 对于 Android 系统来说是可见的。

当你仅需要设置 Data 的 URI 时,请调用 setData() 函数。当你仅需要设置 MIME 类型时,请调用 setType()。如果有必要的话,你可以通过调用 setDataAndType() 函数同时设置 URI 和 MIME 类型。

注意:如果你想要同时设置 URI 和 MIME 类型,不要分别调用 setData()setType() 函数,因为它们将注销彼此设置的值。因此,如果想同时为 URI 和 MIME 设置数据,请调用 setDataAndType() 函数。

4.Category

一个 String,在这个字符串里面包含了目标组件的类型信息。你可以为 Intent 设置足够多的 Category,但是大多数的 Intent 都是不需要 Category 参数的。这里有两个常用的 Category:

CATEGORY_BROWSABLE

目标 Activity 允许被 web browser 启动并用于展示链接相关的内容——例如图片或者电子邮件。

CATEGORY_LAUNCHER

目标 Activity 是一个 Task 中的初始化 Activity,并且将会被放入到 系统应用 Laughter 中。

你可以通过查看 Intent 类了解更多关于 Category 的信息。

当你需要为 Intent 指定 Category 时,请调用 addCategory() 函数。

上面列举属性都是用来定义 Intent 特性的,通过解析这些特性,Android 系统就可以确定启动哪个组件。

但是 Intent 除了上面提到的特性外,还包含一些不影响启动目标组件的信息。Intent 还支持:

Extras

Extras 以键值对的形式存储数据。就像某些 Action 需要一些特定的 URI 一样,某些 Action 也需要一些特定的 Extras。

你可以通过调用 putExtra() 函数向 Intent 中添加数据,这个函数接收两个参数:key 值和 value 值。当然,你也可以先将数据存入 Bundle,然后再调用 Intent 的 putExtras() 函数将 Bundle 存入 Intent 中。

例如:当通过 Intent 发送 Email 的时候,你可以设置 Intent 的Action 参数为 ACTION_SEND,然后通过指定 Extras 的 key 为 EXTRA_EMAIL 指定接收者,通过指定 Extras 的 key 为 EXTRA_SUBJECT 指定邮件的主题。

Android 系统提供了很多标准的 EXTRA_* 常量,但是有时候开发者还是会自定义 extra key,当你在自定义 extra key 的时候,记得加上应用程序的包名。例如:

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

Flags

Flags 定义了 Intent 功能的元信息。简单的说就是:Flags 将指导 Android 系统如何启动一个 Activity 并且在启动之后如何将它“归类”(whether it belongs in the list of recent activities)。想要了解更多信息,请参考 setFlags() 函数。

1 0
原创粉丝点击