Intent的使用

来源:互联网 发布:科比生涯数据场均 编辑:程序博客网 时间:2024/06/06 00:53

Intent被称之为意图,意图就是表达一个想做某件事的一种意愿.

1.Intent的作用

1>启动Activity
2>启动/绑定Service
3>发广播
4>以及这几个组件之间的通信

2.Intent分类

1>显示Intent

直接指定要启动的组件名或者包名,一般在本应用中使用
例如:

Intent intent = new Intent(FirstActivity.this,SecondActivity.class)startActivity(intent);
Intent intent = new Intent();intent.setClass(FirstActivity.this,SecondActivity.class);//intent.setClassName(FirstActivity.this,"com.tedu.demo.SecondActivity");startActivity(intent);

上面几种效果是一样的都是从FirstActivity跳转到SecondActivity,都是通过直接指定组件名的方式

2>隐式Intent
不直接指定一个组件名,而是通过表达一个意图,通过设置Action,添加Category,设置Data,设置Type实现,
只要其他应用的组件的IntentFilter中与Intent的限制项匹配,则该组件就是可以被启动的,如果有多个其他应用组件满足,由用户选择启动谁,这个是跨进程的.

隐式Intent使用时会添加很多限制条件,主要的作用就是筛选出我们需要启动的组件.

比如:我们想买手机的时候,我们不指定买哪一款手机,但是我们会对我们买的手机提出一些要求,屏幕5,5寸,2.5D玻璃,骁龙820等等,只要手机满足以上的功能,或者比我们期望的功能更多,那么这就是我们所要的,如果有很多的满足我们的要求,这时由我们选择买哪一个.

其实Intent和IntentFilter就是这种关系:
Intent会携带限制条件(通过Action/Category/Data/Type),就是我们对手机的要求,不满足要求的肯定不要
IntentFilter就是我们想买的手机的配置,在程序中就是其他应用的组件的描述.
IntentFilter只要包含我们Intent的条件就是满足的,如果比我们期望还多,这也是允许的.

所以一个组件要想被启动,这个组件的描述IntentFilter包含的内容一定要大于等于Intent中的内容.

注意点:Intent在使用时,默认会携带一个Intent.CATEGORY_DEFAULT, 所以在IntentFileter中至少要包含这样一个Category.

3.Intent的限制条件(筛选组件条件)

1>Action:
一个Intent在使用时,只能携带一个Action,通过Intent的setAction()方法多次,最后一个有效.

2>Category:
一个Intent使用时,可以携带多个Category,通过Intent的addCategory()方法可以添加多个.

3>Data:他是对Action的描述,用于启动其他组件时携带传递的数据
注意:此处的Data和IntentFilter满足至少原则
如:

intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"))

第一种情况:

IntentFilter清单文件的data标签:<data android:scheme="lee"/>

第二种情况:

IntentFilter清单文件的data标签:<data android:scheme="lee"android:port="9999">

第一种情况的组件会被Intent启动
第二种情况的组件不能被启动
对于Data而言:
Intent内容必须完全包含IntentFilter的内容的组件会响应,也就是此处Intent内容可以比IntentFilter多

就在这种情况下特殊,其他IntentFilter必须完全包含Intent的条件

4>Type:这个是对Data传递的数据类型的描述(MIME)

通常情况下Data和Type存在后者覆盖前者的效果,就是后设置的会将前面的覆盖掉:
如:

setData(Uri data)setType(String str)

后面的会覆盖前面的,也就是setData(Uri data)失效了

如果两个都起效果,就要使用setDataAndType(Uri data,String str);

5>Flag(标识)
用于限制被启动组件的启动情况,比如限制Activity以什么方式启动,在新栈中启动,还是其他,具体使用看官方文档.

注意区别:Extra用于本应用中组件之间通信携带的数据.

4.IntentFilter(组件的描述用于匹配Intent)
使用方式:
一般在清单配置文件中使用:
1>action标签:(可以添加多个)

2>category标签:(可以添加多个)
注意:一定要有一个category标签是

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

因为Intent使用默认携带这个,没有无法被启动!

3>data标签:(此标签包含Intent的限制条件data和type)(0个或1个)

注意:广播接收者BroadCastReciver动态注册时,需要在代码中声明IntentFilter

1 0