android之intent

一.Intent的介绍

Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。

1,使用 Intent Filter ,应用程序组件告诉 Android ,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。

2,一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。

3,action使用 android:name 特性来指定对响应的动作名。动作名必须是独一无二的字符串,所以,一个好的习惯是使用基于 Java 包的命名方式的命名系统。

二.Inten启动组件的方法

Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。具体方法如下:

组件名称方法名称
ActivitystartActvity( )
startActivity( )
ServicestartService( )
bindService( )
BroadcastssendBroadcasts( )
sendOrderedBroadcasts( )
sendStickyBroadcasts( )

三.Intent的属性

Intent有以下几个属性:

动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。

1.Intent的Action属性

Action是指Intent要完成的动作,是一个字符串常量。SDK中定义了一些标准的Action常量如下表所示。

                ACTION_MAIN:Android Application的入口,每个Android应用必须且只能包含一个此类型的Action声明。 
    ACTION_VIEW:系统根据不同的Data类型,通过已注册的对应Application显示数据。
    ACTION_EDIT:系统根据不同的Data类型,通过已注册的对应Application编辑示数据。 
    ACTION_DIAL:打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码。 
    ACTION_CALL:直接呼叫Data中所带的号码。 
    ACTION_ANSWER:接听来电。 
    ACTION_SEND:由用户指定发送方式进行数据发送操作。
    ACTION_SENDTO:系统根据不同的Data类型,通过已注册的对应Application进行数据发送操作。 
    ACTION_BOOT_COMPLETED:Android系统在启动完毕后发出带有此Action的广播(Broadcast)。 
    ACTION_TIME_CHANGED:Android系统的时间发生改变后发出带有此Action的广播(Broadcast)。 
    ACTION_PACKAGE_ADDED:Android系统安装了新的Application之后发出带有此Action的广播(Broadcast)。 
    ACTION_PACKAGE_CHANGED:Android系统中已存在的Application发生改变之后(如应用更新操作)发出带有此Action的广播(Broadcast)。 
    ACTION_PACKAGE_REMOVED:卸载了Android系统已存在的Application之后发出带有此Action的广播(Broadcast)。

2.Intent的Data属性

data,即执行动作要操作的数据。

data描述了Intent的动作所能操作数据的MIME类型和URL,不同的Action用不同的操作数据。例如,如果Activity字段是ACTION_EDIT,data字段将显示包含用于编辑的文档的URI;如果Activity是ACTION_CALL,data字段是一个tel://URI和将拨打的号码;如果Activity是ACTION_VIEW,data字段是一个http://URI,接收活动将被调用去下载和显示URI指向的数据。在许多情况下,数据类型能够从URI中推测出来,特别是content://URIs,它表示位于设备上的数据且被内容提供者(Content Provider)控制。但是类型也能够显示设置,setData()方法指定数据的URI,setType()指定MIME类型,setDataAndType()指定数据的URI和MIME类型。通过getData()读取URI,getType()读取类型。

匹配一个Intent到一个能够处理data的组件,知道data的类型(它的MIME类型)和它的URI很重要。例如,一个组件能够显示图像数据就不应该被调用去播放音频文件。

        tel://:号码数据格式,后跟电话号码。 
    mailto://:邮件数据格式,后跟邮件收件人地址。
    smsto://:短息数据格式,后跟短信接收号码。
    content://:内容数据格式,后跟需要读取的内容。 
    file://:文件数据格式,后跟文件路径。
    market://search?q=pname:pkgname:市场数据格式,在Google Market里搜索包名为pkgname的应用。
    geo://latitude, longitude:经纬数据格式,在地图上显示经纬度所指定的位置。

3.Intent的Category属性

category(类别),Category属性用于指定当前动作(Action)被执行的环境。例如,LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。其他的如表2所示。默认为:CATEGORY_DEFAULT。

              CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。 
    CATEGORY_HOME:设置该组件为Home Activity。
    CATEGORY_PREFERENCE:设置该组件为Preference。 
    CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。 
    CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动。 
    CATEGORY_GADGET:设置该组件可以内嵌到另外的Activity中。

通过addCategory()方法添加一个种类到Intent对象中;通过removeCategory()方法删除一个之前添加的种类;通过getCategories()方法获取Intent对象中的所有种类。

4.Intent的Type属性

Intent的Type属性显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

5.Intent的Compent属性

ComponentName(组件),指定Intent的目标组件的类名称。ComponentName包含两个String成员,分别代表组件的全称类名和包名,包名必须和AndroidManifest.xml文件标记中的对应信息一致。ComponentName通过setComponent()、setClass()或setClassName()设置,通过getComponent()读取。

通常 Android会根据Intent 中包含的其他属性的信息(如action、data/type、category)进行查找,最终找到一个与之匹配的目标组件。但是,如果ComponentName这个属性有指定,将直接使用指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其他所有属性都是可选的。

对于Intent,组件名并不是必需的。如果一个Intent对象添加了组件名,则称该Intent为“显式Intent”,这样的Intent在传递时会直接根据组件名去寻找目标组件。如果没有添加组件名,则称为“隐式Intent”,Android会根据Intent中的其他信息来确定响应该Intent的组件。

 6.Intent的Extra属性

Intent的Extra属性是添加一些组件的附加信息。比如,如果我们要通过一个Activity来发送一个Email,就可以通过Extra属性来添加subject和body。

 下面的例子在第一个Activity的EditText输入用户名,该年龄保存在Intent的Extras属性中。当单击Button时,会在第二个Activity中显示用户名。

              EXTRA_BCC:存放邮件密送人地址的字符串数组。 
    EXTRA_CC:存放邮件抄送人地址的字符串数组。
    EXTRA_EMAIL:存放邮件地址的字符串数组。 
    EXTRA_SUBJECT:存放邮件主题字符串。 
    EXTRA_TEXT:存放邮件内容。 
    EXTRA_KEY_EVENT:以KeyEvent对象方式存放触发Intent的按键。  
    EXTRA_PHONE_NUMBER:存放调用ACTION_CALL时的电话号码。

四、 intent的解析

在应用中,我们可以以两种形式来使用Intent:
-          直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
-          间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
         对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有<intent-filter>及其中定义的Intent,通过PackageManager(注:PackageManager能够得到当前设备上所安装的application package的信息) 来查找能过处理这个Intent的component。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方 法如下:
-          如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
-          如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
-          如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者 mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
-          如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

显式:

Intent intent = new Intent(Test.this, TestB.class);  
startActivity(intent);

或者:

Intent intent = new Intent();    
intent.setClass(TestBundle.this, Target.class);    
intent.putExtras(mBundle); //传递信息
startActivity(intent);

隐式
浏览网页 (系统预定义配置)

Uri uri = Uri.parse("http://www.google.com"); 
Intent intent = new Intent(Intent.ACTION_VIEW,uri); 
startActivity(intent);  

五、Intent的构造函数

公共构造函数:
1、Intent() 空构造函数
2、Intent(Intent o) 拷贝构造函数
3、Intent(String action) 指定action类型的构造函数
4、Intent(String action, Uri uri) 指定Action类型和Uri的构造函数,URI主要是结合程序之间的数据共享ContentProvider
5、Intent(Context packageContext, Class cls) 传入组件的构造函数,也就是上文提到的
6、Intent(String action, Uri uri, Context packageContext, Class cls) 前两种结合体
Intent有六种构造函数,3、4、5是最常用的,并不是其他没用!
Intent(String action, Uri uri) 的action就是对应在AndroidMainfest.xml中的action节点的name属性值。在Intent类中定义了很多的Action和Category常量。


六、利用Intent在Activity之间传递数据

在Main中执行如下代码:

Bundle bundle = new Bundle();
bundle.putStringArray("NAMEARR", nameArr);
Intent intent = new Intent(Main.this, CountList.class);
intent.putExtras(bundle);
startActivity(intent);
在CountList中,代码如下:

Bundle bundle = this.getIntent().getExtras();
String[] arrName = bundle.getStringArray("NAMEARR");



相关引用:

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

http://hualang.iteye.com/blog/983471

Android开发学习笔记:Intent的简介以及属性的详解

http://liangruijun.blog.51cto.com/3061169/634411

详解Android Intent

http://zy77612.iteye.com/blog/764699

Android开发:理解Intent

http://www.imyukin.com/?p=183

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值