Android----Intent详解

1.Intent对于Android应用的作用

大体可以分为两个功能:

① 封装Android应用程序需要启动某个组件的“意图”

② 作为应用组件之间的通信的媒介,将需要交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象

2.Intent对象详解

2.1 使用Intent启动系统组件

启动Activity:startActivity(Intent intent)

startActivityForResult(Intent intent,int requestCode)

启动Service:ComponentName startService(Intent intent)

boolean bindService(Intent service,ServiceConnection conm,int flags)

启动BroadcastReceiver:sendBroadcast(Intent intent)

sendBroadcast(Intent intent,String recePermission)etc

2.2 Intent的属性及intent-filter配置

Intent代表了Android应用启动一个应用的意图,Android应用将会根据Intent来启动指定组件,

至于启动哪个组件,就需要根据不懂的属性值来判断。

2.2.1 Component属性

首先介绍一个组件的概念:包括Service(服务),Activity(活动),Content(内容),

Intent(意图),BroadcastRece(广播),Notification(通知)

Intent的Component(成分)属性接受一个叫做ComponentName的值,ComponentName的结构器有:

Component(String pkg)//创建pkg所在包下的cls类所对应的所有组件

Component(String pkg,String cls)//创建pkg所对应的包下的cls类所对应的组件

Component(String pkg,Class cls)//创建pkg所对应的包下的cls类所对应的组件

他们的都是根据包明和类名去确定一个组件 然后启动它

还可以通过Intent的setClass(Context package,Class cls),setClassName(Context packageContext,String className)

setClassName(Strong packageName,String className)来指定该Intent要启动的组件

这种明确的指定启动哪个组件的叫做显式Intent 还有一种根据规则去启动和服规则的组件的叫做隐式Intent

for example 

1
2
3
4
5
6
7
8
9
10
HelloWorld1.java
 
Intent intent = new Intent();
ComponentName component = new ComponentName(HelloWorld1.this,HelloWorld2.class);
intent.setComponent(component);
startActivity(intent);
 
HelloWorld2.java
 
ComponentName component = getIntent().getComponent();//可以通过Intent获取Component的值

 

2.2.2 Action、Category属性与intent-filter配置

Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象动作,而Category则用于

为Action增加额外的附近类别信息。通常Action与Category属性会结合使用。

当一个Activity或者其他的组件的配置信息中的Action和Category的值是多少。通常包括0~N个子元素

0~N个子元素 和 0~1个子元素。这就是相当一个妹子要找嫩朋友的条件。

当Intent设置的Action和Category全部满足组件的Action和Category时,该组件就会被打开了,这就相当于一个男孩子完全满足了妹子找的

条件后就在一起了。

一般来说,Intent一般只会指定一个Action,但是可以指定多个Category

2.2.3 指定Action、Category调用系统Activity

Action和Category的对应表 点击打开链接

2.2.4 Data、Type属性与intent-filter配置

Data属性通常用于向Action属性提供操作数据,Data属性接受一个uri对象,uri通常通过如下形式的字符串来表示:

 

1
2
content://com.android.contacts/contacts/1
tel:123

uri字符串要满足如下格式:

 

scheme://host:port/path

content是scheme部分,com.android.contacts是host部分,port部分被省略,/contacts/1是path部分

Type属性用于指定该Data所指定uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,

只要符合abc/xyz格式的字符串即可。

Type和Data属性有时候会相互覆盖,例如:Intent先设置Data属性再设置Type属性,Tpye就会覆盖Data

属性,反之亦然。解决方法就是设置调用setDataAndType()方法

对应的,在AndroidMainifest.xml文件中通过元素来设置Type,Data属性值

元素支持如下属性:

mimeType:用于声明该组件所匹配的Intent的Type属性

scheme:用于声明该组件所匹配Intent的Data属性的scheme部分

data:用于声明该组件所匹配的Intent的Data属性的host部分

host:用于声明该组件所匹配的Intent的Data属性的host部分

port:用于声明该组件所匹配的Intent的Data属性的port部分

path:用于声明该组件所匹配的Intent的Data属性的path部分

pathPrefix:用于声明该组件所匹配的Intent的Data属性的path前缀

pathPattern:用于声明该组件所匹配的Intent的Data属性的path字符串模板

启动组件的时候Type必须完全符合,但是Intent的data值只设置了一部分,则只需要满足设置的那部分就能启动了。

2.2.5 Extra属性

Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bnudle对象,Bundle

对象就是一个Map对象,可以存入多对key-value值

2.2.6 Flag属性

Flag属性用于为该Intent添加一些额外的控制旗杆,可以调用addFlags()方法来为Intent添加控制旗杆

Flag属性的对应表 点击打开链接 

2.3 使用Intent创建Tab页面

在不同的Tab页面下的content为一个Activity

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TabHost tabHost = getTabHost();
TabHost.addTab(tabHost.newTabSpec("tab1")
                      .setIndicator("已接电话")
                      .setContent(new Intent(this,HelloWorld1.class)
                                       )
                       );
 
TabHost.addTab(tabHost.newTabSpec("tab2")
                      .setIndicator("未接电话")
                      .setContent(new Intent(this,HelloWorld2.class)
                                       )
                       );
 
TabHost.addTab(tabHost.newTabSpec("tab3")
                      .setIndicator("呼出电话")
                      .setContent(new Intent(this,HelloWorld3.class)
                                       )
                       );

 

结伴旅游,一个免费的交友网站:www.jieberu.com

推推族,免费得门票,游景区:www.tuituizu.com

posted @ 2015-02-10 11:01  回忆安在  阅读(347)  评论(0编辑  收藏  举报