Android——Intent和Intent过滤器

http://www.cnblogs.com/XP-Lee/p/3613830.html

Intent就是一个激活组件的消息对象,用于组件之间的通信。需要注意的是,能被Intent激活通信的组件只有三类:Activity、Service和BroadcastReceiver。对应这三类组件,Intent有下面三种使用场景:

  • 启动Activity:在app中,一个Activity就代表一个用户界面。以Intent为参数调用startActivity()启动一个Activity实例。这个Intent告诉Activity去启动,并且传递了一些必要数据给它。在Activity结束时,如果想要从这个结束的Activity接收数据,可以使用startActivityForResult()启动,这样在你的Activity的 onActivityResult()回调就会接收到单独的结果Intent。
  • 启动Service:Service没有用户界面,它的职责就是在后台执行操作。以Intent为参数调用startService()启动一个Activity实例。这个Intent告诉Service去启动,并且传递了一些必要数据给它。如果Service被设计成C/S结构的Server,你可以在其它组件中以Intent为参数调用bindService()绑定这个Service。
  • 发送广播:一个广播消息是可以被任何app接收的。系统为各种系统事件发送广播,你也可以发送广播( sendBroadcast()sendOrderedBroadcast(), or sendStickyBroadcast())。

上述这些Intent传递,不会有重叠。广播Intent仅被传递给Receiver,永远不会给Activity或者Service;一个传送给Activity的Intent是只会被传递给Activity,永远不会给一个Service或Receiver;如此类推。

Intent类型(Intent Types)



Intent有两种类型:

  • 显式Intent:使用全类名启动一个组件。显示Intent启动组件是在你自己的app当中的,因为需要知道一个组件的类名。
  • 隐式Intent:不实用类名,而是通过action去启动。隐式Intent启动的组件允许来自于另一个app。

显式Intent启动,Android系统可以通过这个Intent对象立即启动组件。

隐式Intent启动,Android系统会将Intent的内容与设备所有app的manifest文件中的Intent过滤器比较,找出最合适的组件去启动。如果Intent和Intent过滤器匹配,系统就会启动组件并且传递Intent对象。如果有多个Intent过滤器匹配,系统会显示一个对话框,供用户选择使用哪一个app。(注,Intetn过滤器是manifest中的一个符号,指明一个组件可以接收什么样的Intent。)

上图为隐式Intent启动Activity的过程。【1】Activity A通过action创建一个Intent,让后以这个Intent为参数调用startActivity()。【2】Android系统会隐式Intent,搜索匹配所有app的Intent过滤。【3】系统匹配到Activity B,调用它的onCreate()方法并且传递Intent。

警告:为了确保app的安全性,通常使用显式Intent启动Service,并且不给Service声明Intetn过滤器。使用隐式Intent启动Service是危险的,因为你不可能确定多少个Service会响应这个Intetn,并且用户看不到哪个Service启动了。

创建Intent(Building an Intent)



Intent的主要信息如下:

Component name

启动的组件名称。

对于隐式启动来说,Component name是可选的。但是对于显示启动来说,Component name是必须的信息。没有Component name信息的Intent就是一个隐式的Intent,系统会基于Intent的其它信息(比如action、data、category)决定哪个组件来接收Intent。

Action

执行通用操作的字符串。

系统框架提供了许多action常量,下标列出部分内容:

常量 目标组件 Action
ACTION_CALL Activity 打电话
ACTION_SCREEN_ON BroadcastReceiver 屏幕开启
ACTION_TIMEZONE_CHANGED BroadcastReceiver 时区变化

自定义action,应该尽量使用包名作为前缀。比如:

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

Data

被执行数据的URI和它的MIME类型。通常,不同的action会伴随不同的数据类型。例如, 如果action为ACTION_EDIT, 那么Data将包含待编辑的数据URI. 如果action为ACTION_CALL, Data将为tel:电话号码的URI. 如果action为ACTION_VIEW, 则Data为http:网络地址的URI.

当创建一个Intent时,为数据指定一个MIME类型作为URI的补充,是非常必要的。比如,一个activity可以显示图片但是不能播放音频(尽管图片和音频的URI是非常相似的)。因此,为数据指定一个MIME类型可以帮助Android系统找到最佳的组件接收Intent。

然而,MIME类型有时候可以通过特别的URI推测出来。比如content: URI,它表明数据位于设备上面,并且数据是被ContentProvider控制的,这就使的数据的MIME类型对系统来说是可见的。

警告:如果想要设置URI和MIME类型,应该调用setDataAndType();而不是同时调用setData()setType(),因为它们会使彼此的值无效。

Category

一个附加信息的的字符串,包含了关于可以处理该Intent的组件种类信息。一个Intent可以有多个Category,但是大多数Intent需要Category。下面是一些公共Category信息:

常量 含义
CATEGORY_BROWSABLE 目标activity可以被浏览器安全的启动,用来显示链接应用的数据——比如,一张图片或者一封邮件
CATEGORY_GADGET 这个activity可以被嵌入到另一个activity中
CATEGORY_HOME 这个activity电视home界面,即设备打开或者按Home键看到的第一个页面
CATEGORY_LAUNCHER 这个activity可以作为task的初始activity,并且是被列应用程序启动器中
CATEGORY_PREFERENCE 目标activity是一个选项面板

上面的内容(component name, action, data, and category)描述了Intent的典型特征。通过读取这些内容,Android系统可以决定哪个组件可以被启动。

然而,Intent还可以携带一些额外信息,这些额外信息不会影响系统选取组件,这些额外信息就是Extras和Flags。

Extras

Key-value形式的额外信息。

Intent类定义了许多的EXTRA_* 常量的标准数据类型。如果要自定义extra keys,应该尽量使用包名作为前缀:

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

Flags

flag被定义在Intent类中,它作为Intent的metadata(描述数据的数据)。flag可以告诉Android系统如何启动一个activity(比如,这个activity属于哪一个task),并且在启动后如何管理这个activity(比如,这个activity是否属于recent activities列表)。

使用待定Intent(Using a Pending Intent)



PendingIntent是对Intent的包装。PendingIntent的主要目的是授予外部程序使用被包装的Intent,好像Intent在自己的进程中执行。

pending intent的主要使用场景如下:

  • 用户执行一个你的Notification相关的操作(Android系统的NotificationManager会执行这个Intent)。
  • 用户执行一个你的App Widget相关的操作(Home screen app会执行这个Intent)。
  • 未来某一个特定时刻执行(Android系统的AlarmManager会执行这个Intent)。

由于Intent被设计成只有特定类型的组件(Activity、Service和BroadcastReceiver)才能处理,因此PendingIntent的创建也必须要基于这层考虑。创建PendingIntent时,必须根据组件类型的不同,分别调用对应的方法创建:

这些方法最好使用当前app的Context。更多的关于PendingIntent的使用,参考NotificationsApp Widgets的Api指南。

Intent解析(Intent Resolution)



当系统收到一个隐式Intent的时候,系统会通过比较Intent和Intent比较器寻找最佳的activity,系统基于以下三个方面来比较:

  • action
  • data(URI和数据类型——MIME)
  • category

Action test

一个Intent过滤器可以声明零个或多个<action>元素。比如:

1 <intent-filter>
2     <action android:name="android.intent.action.EDIT" />
3     <action android:name="android.intent.action.VIEW" />
4     ...
5 </intent-filter>
时间: 2024-10-12 15:39:34

Android——Intent和Intent过滤器的相关文章

Android基础之Intent 和 Intent 过滤器

Intent是一个消息传递对象,您可以使用它从其他应用组件请求操作.尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个: 1.启动 Activity: Activity 表示应用中的一个屏幕.通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例.Intent 描述了要启动的 Activity,并携带了任何必要的数据.如果您希望在 Activity 完成后收到结果,请调用 startActivityForResult

Android基础——隐式intent和intent过滤器

当不直接在intent中指定组件名时,就是隐式使用intent,此时要配合过滤器来使用,找到目标的组件 注册文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myintentiii"> <

记录:Intent、Intent过滤器和通用Intent

摘要:现在可以看中文的部分文档,可是内容真心不好记.看过之后就无名的又忘记了.还是摘抄一道的方式去加深记忆和当做一次笔记方便后面自己快速查找.记录一下,Intent,Intent的过滤和 常用的通用 Intent Intent ??intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中链接两个不同的组件.通过 intent,你的程序可以向 Android表带某种请求或者意愿,Android会根据意愿的内容适当的组件来完成请求.比如,有一个 activity 希

Android组件系列----Intent详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3959204.html 联系方式:[email protected] [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确

android学习五 Intent

1.Intent是组件间调用的桥梁. 2.Android系统定义了很多Intent    http://developer.android.com/guide/components/intents-common.html 3.Intent    Intent包括的内容可以有以下一个或多个 操作 数据 extra数据 组件名称 包含组件名称的Intent叫显示Intent,否则 叫隐式Intent.显示Intent在做目标活动匹配时会忽略掉除组件名称的其他部分内容. new Intent(Inte

Android开发教程:理解Intent和Intent Filter

在Android 帮助文档中,Intent的介绍为An intent is an abstract description of an operation to be performed,意思是一个Intent是对一个即将进行的操作的抽象,Intent的字面意识就是“意图”,Android应用程序中的三种其他应用程序基本组件——Activity, Service和Broadcast Receiver,都是使用称为intent的消息来”激活”的.对于向这三种组件发送intent有不同的机制: 使用

Intent 和 Intent 过滤器

Intent 和 Intent 过滤器 本文内容 Intent 类型 构建 Intent 显式 Intent 示例 隐式 Intent 示例 强制使用应用选择器 接收隐式 Intent 过滤器示例 使用待定 Intent Intent 解析 操作测试 类别测试 数据测试 Intent 匹配 另请参阅 与其他应用交互 共享内容 Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作.尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个: 启动 Acti

Android学习之Intent传递数据

Intent在Activity中的作用主要是有两个: 1.启动目标Activity 2.传递数据 Intent在传递数据时分两种情况:向下一个Activity传递数据和从下一个Activity返回数据. 一.向下一个Activity传递数据主要是利用Intent作为“信使”来调用, 原Activity需要创建一个intent,并用putExtra(键,值)方法向intent中放入需要传递的信息,然后启动. public void onClick(View view){ String msg =

Android笔记:intent

一.显式intent如下:(1)在intent构造函数传入两个activity文件名Intent intent = new Intent(FirstActivity.this, SecondActivity.class);startActivity(intent);(2)记得在AndroidManifest.xml中为SecondActivity进行注册<activity android:name="SecondActivity" ></activity> 二.