安卓进阶专题篇-Intent

Android的三个基本组件——Activity,Service和Broadcast Receiver——都是通过Intent机制激活的,不同类型的组件有不同的传递Intent方式,我们经常使用intent,但若不认真分析intent,确经常云里雾里的.

那么什么是intent呐,意图,就是你要通过i可以通过intent干些什么事。是一个将要执行的动作的抽象的描述,由Intent来协助完成android各个组件之间的通讯。比如调用Activity实例化对象的startActivity()来启动一个activity,或者由broadcaseIntent()来传递给所有感兴趣的BroadcaseReceiver,
或者由startService()/bindservice()来启动一个后台的service。可见,intent主要用来启动activity或者service(并携带需要传递的参数信息),intent理解成activity之间的粘合剂。

总之,Intent具有激活组件和携带数据的功能!

         具体的三大组件的Intent方式:

   
1.1 要激活一个新的Activity,或者让一个现有的Activity做新的操作,可以通过调用Context.startActivity()或者Activity.startActivityForResult()方法。

1.2 要启动一个新的Service,或者向一个已有的Service传递新的指令,调用Context.startService()方法或者调用Context.bindService()方法将调用此方法的上下.Intent形式文对象与Service绑定。

1.3 Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个方法可以发送Broadcast Intent。发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。

Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity,Service或者BroadcastReceiver作响应。所以,不同类型的Intent消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,而决不会发送给Activity或者Service。由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。

Intent形式

(1).显示意图(Explicit Intents)

明确指定组件名的Intent为显式意图,指定了Intent应该传递给那个组件。通过下面代码方式,可以创建显示意图实例化对象,并设定需要传递的参数信息。由于显示意图指定了具体的组件对象,不需要设置intent的其它意图过滤对象。

[java]

//  1.创建Intent实例化对象几种方式

Intent intent = new Intent();

intent.setClass(Context packageContext, Class<?> cls) ;           //内部调用setComponent(ComponentName)

intent.setClassName(Context packageContext, String className) ; //内部调用setComponent(ComponentName)

intent.setClassName(String packageName, String className) ;     //内部调用setComponent(ComponentName),可以激活外部应用

intent.setComponent(new ComponentName(this, Class<?> cls));

intent.setComponent(new ComponentName(this, "package Name"));

2).隐式意图(Implicit Intents)

没有明确指定组件名的Intent为隐式意图,系统会根据隐式意图中设置的 动作(action)、类别(category)、数据URI等来匹配最合适的组件。

1).action

The general action to be performed, such as ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, 包括Android 系统指定的 和 自定义

[java]

intent.setAction("com.baidu.action.TEST");

[html] view plaincopy

<action android:name="com.baidu.action.TEST"/>

2).data

expressed as a Uri, The data to operate on, such as a person record in the contacts database.

系统自带的Action简单举例

Action Data(Uri)
Content

ACTION_VIEW

content://contacts/people/1

Display information about the person whose identifier is "1".

ACTION_VIEW

tel:123

Display the phone dialer with the given number filled in.

ACTION_DIAL

tel:123

Display the phone dialer with the given number filled in.

自定义data匹配

[java]

intent.setData(Uri.parse("baidu://www.baidu.com/news"));

[html]

<!-- android:path 内容字符串需要以 / 开头 -->

<data android:scheme="baidu" android:host="www.baidu.com" android:path="/news"/>

3).category

Gives additional information about the action to execute.

注意:项目清单的xml文件意图过滤器中必须指定 android.intent.category.DEFAULT类别,Activities will very often need to support the CATEGORY_DEFAULT so that they can be found by Context.startActivity,or Context can‘t the acitivity component

[java]

intent.addCategory("com.baidu.category.TEST");

[html]

<!-- 必须指定CATEGORY_DEFAULT,只有这样startActivity(intent)才能找到 -->

<category android:name="com.baidu.category.TEST" />

<category android:name="android.intent.category.DEFAULT" />

除了以上主要属性外,下面还有其它属性可以额外增强。

4).type

Specifies an explicit type (a MIME type) of the intent data.

[java]

intent.setType("image/jpeg");

[html] view plaincopy

<data android:mimeType="image/*" />

注意:java文件中data Uri 和 type不能同时使用各自的函数进行设定,因为使用type时会把Uri清除掉,可以使用setDataAndType方法设定

[java]

intent.setDataAndType(Uri.parse("baidu://www.baidu.com/news"), "image/jpeg");

[html]

<data android:mimeType="image/*" android:scheme="baidu" android:host="www.baidu.com" android:path="/news"/>

(3).两者的使用区别

显式意图一般在应用的内部使用,因为在应用内部已经知道了组件的名称,直接调用就可以了。

当一个应用要激活另一个应用中的Activity时,只能使用隐式意图,根据Activity配置的意图过滤器建一个意图,让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。所以,隐式意图是在应用与应用之间使用的。

ntent解析机制

Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有<intent-filter>及其中定义的Intent,通过PackageManager(注:PackageManager能够得到当前设备上所安装的

application package的信息)来查找能处理这个Intent的component。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:

1.1  如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;

1.2  如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

1.3  如果Intent中的数据不是content:类型的URI,而且Intent也没有明确指定type,将根据Intent中数据的scheme(比如 http:或者mailto:)进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。

1.4 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

时间: 2024-10-03 13:39:54

安卓进阶专题篇-Intent的相关文章

JMeter学习-011-JMeter 后置处理器实例之 - 正则表达式提取器(三)多参数获取进阶引用篇

前两篇文章分表讲述了 后置处理器 - 正则表达式提取器概述及简单实例.多参数获取,相应博文敬请参阅 简单实例.多参数获取. 此文主要讲述如何引用正则表达式提取器获取的数据信息.其实,正则表达式提取器获取的数据,均可看做一个变量(单个数据,此处指所需获取的测试相关数据)或数组(多个数据),通过引用变量或者数组的数据,达到应用其数据的目的.下面针对此两种方式进行介绍. 第一种:单数据变量 但数据变量的应用比较简单,同我们日常 shell 脚本引用变量相同,引用样式:引用名称.例如要引用下图中的变量,

MySQL的进阶实战篇

[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/69857949 出自[zejian的博客] 关联文章: MySQL的初次见面礼基础实战篇 MySQL的进阶实战篇 本篇上一篇博文MySQL的初次见面礼基础实战篇的延续,是mysql的进阶内容的记录,本篇主要知识点如下: 进阶实战篇 进阶实战篇 mysql视图机制 什么是视图 视图创建与使用 视图的本质 高效索引 使用索引的理由 索引

玩转Android---组件篇---Intent(意图)

Intent的中文意思是“意图,目的”的意思,可以理解为不同组件之间通信的“媒介”或者“信使”. 目标组件一般要通过Intent来声明自己的条件,一般通过组件中的<intent-filter>元素来过滤. Intent在由以下几个部分组成:动作(action),数据(data),分类(Category),类型(Type),组件(Component),和扩展信息(Extra). Intent在寻找目标组件的时候有两种方法:第一,通过组件名称直接指定:第二,通过Intent Filter过滤指定

Kubernetes 1 3 从入门到进阶 安装篇(1)

Kubernetes 1.3 从入门到进阶 安装篇:minikube Kubernetes单机运行环境一直是一个没有得到重视的问题.现在我们有了minikube,一个用go语言开发的可以在本地运行kubernetes的利器,不过目前应该只是支持kubernetes1.3.如果你只有一台机器或者虚拟机又想试验一下Kubernetes的新的功能,或者作kubernetes上开发的本地环境,minikube可能是你不错的选择. 下载minikube并设定 下载的时候突然发现版本已经是0.7.0了,发现

Kubernetes 1 3 从入门到进阶 安装篇(2)

Kubernetes 1.3 从入门到进阶 安装篇: kubernetes-ansible 上一篇文章我们介绍了使用minikube快速部署kubernetes1.3到单机上. 多台机器构成的集群,本次介绍kubernetes-ansible来进行安装.ansible是自动化部署一大神器,接下来就让我们来看看使用神器的效果吧. 构成说明 master和etcd共用一台机器,只有一个minion的超级mini构成,只是为演示只用. No type IP OS 1 master 192.168.32

安卓进阶篇-Bundle

Android中Bundle类的作用 Bundle类用作携带数据, 根据google官方的文档(http://developer.android.com/reference/android/os/Bundle.html) Bundle类是一个key-value对,"A mapping from String values to various Parcelable types." ,它类似于Map,用于存放key-value名值对形式的值.相对于Map,它提供了各种常用类型的putXx

安卓开发 activity和intent初步学习

安卓开发 主要是以activity为基础 若要实现一个activity  必须要在AndroidManifest.xml这个文件进行注册 1 <activity 2 android:name=".FirstActivity" 3 android:label="This is the first activity which i code"> 4 <intent-filter> 5 <action android:name="a

Android基础学习第三篇—Intent的用法

写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对的地方,希望大家给与指正. 2. 由于类似于读书笔记,可能格式神马的会比较随(hen)意(chou),大家看着受不了,可以使劲吐槽. *************************************我只是分割线***************************************

数组使用---进阶编程篇(五)

本篇文章讲解数组的使用,先是介绍下几种不同的数组,在说明下各自的区别和使用场景,然后注意细节,废话不多说,赶紧上代码. 在.Net 3.5之中,我们常用的数组基本就是如下的几种方式(词典Dictionary<TKey,TValue>比较特殊,下面单独解释): ArrayList 方式的数组 T[] 方式的数组 List<T> 方式数组 Queue<T> 先进先出的数组 Stack<T> 后进先出的数组 ArrayList: 简单的说,ArrayList是一个