1.Intent是组件间调用的桥梁。
2.Android系统定义了很多Intent
http://developer.android.com/guide/components/intents-common.html
3.Intent
Intent包括的内容可以有以下一个或多个
- 操作
- 数据
- extra数据
- 组件名称
包含组件名称的Intent叫显示Intent,否则
叫隐式Intent。显示Intent在做目标活动匹配时会忽略掉除组件名称的其他部分内容。
new Intent(Intent.ACTION_DIAL) //操作
intent.setData(Uri.parse("http://www.google.com")); //数据
putExtra(String name,...);//extra数据
intent.setComponent(new ComponentName("com.android.contacts","com.android.contacts.DialContactsEntryActivity"));//组件名称
4.数据是对URI进行解析的结果,可能是http网页,也可能是ContentProvider...这根据数据模式来确定例如:content:,file:等。
接收的Intent需要通过Intent过滤器来声明是否能处理这种数据模式。
5.预定义的操作
http://developer.android.com/guide/topics/manifest/data-element.html
6.extra数据可以给目标组件提供更多的信息。 extra data通过android.os.Bundle表示,就是键值对的形式,键通常以包名开头,值是任意对象。需要实现android.os.Parcelable接口。
putExtra方法是复制操作。
7.使用组件名称直接调用组件。包名和类名需要完全限定。
8.组件的类别。
预定义的category
http://developer.android.com/reference/android/content/Intent.html#CATEGORY_ALTERNATIVE
9.Intent包括的4部分内容中,如果没有指定组件名称,则为隐式Intent,对于使用隐式Intent来启动其他组件,则对目标组件的确定就是通过剩下3部分综合作用来确定的。
应用应该在声明文件中编写Intent过滤器,用于android系统确定Intent与应用是否匹配。Intent过滤器的格式
如果设置Intent时设置了data(uri),则数据类型应被设置
<intent-filter>
<action android:value="android.intent.action.MAIN" />
<category android:value="android.intent.category.HOME" />
<category android:value="android.intent.category.DEFAULT />
....
</intent-filter>
匹配的基本规则:操作(action),类型(category),数据特征(data android:name 和 data andriod.mimeType)必须与过滤器匹配。
具体的规则:
操作:过滤器不包含则匹配所有操作,如果包括则必须匹配。
数据:过滤器没有指定数据特征则不匹配任何包括数据特征的Intent调用,如果包括则必须匹配。
数据类型 (data android:mimeType):必须匹配。 数据类型的确定有两种方式
a.传入的URI是内容或文件URI,这由ContentProvider或android来确定
b.显示获取intent.getType()。这个需要在客户端构造Intent的时候调用setType(),调用setType就不应该设置URI,因为setType会自动设置。
数据模式,数据授权,数据路径协同匹配,即最长匹配。
Intent类别:调用intent中的所有type必须包含在intent过滤器中。调用intent如果没有包含任何类别则当做default类别,所以希望通过隐式Intent调用的组件必须声明DEFAULT类别。