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
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的值
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或者其他的组件的配置信息<intent-filter />中的Action和Category的值是多少。<intent-filter />通常包括0~N个<Action />子元素
0~N个<Category />子元素 和 0~1个<data />子元素。这就是相当一个妹子要找嫩朋友的条件。
当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通常通过如下形式的字符串来表示:
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文件中通过<data />元素来设置Type,Data属性值
<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
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)
)
);