标签:blog undle 条件 app home on() 包名 start name
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件。Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介。使用Intent启动组件的优势:
Intent对象的setComponent(ComponentName comp)方法用于设置Intent的Component属性,创建一个ComponentName对象需要指定包名和类名--这就可以唯一确定一个组件类,这样应用程序即可根据给定的组件类去启动特定的组件。例如:(两种方式完全等价)
ComponentName comp = new ComponentName(FirstActivity.this, SecondActivity.class); Intent intent = new Intent(); intent.setComponent(comp);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
除了使用setComponent() 之外,还可以使用setClass(),setClassName()来显式指定目标组件,还可以调用getComponent()方法获得Intent中封装的ComponentName对象。
当程序采用这种形式启动组件时,在Intent中明确的指定了待启动的组件类,此时的Intent属于显式intent。显式Intent应用场合比较狭窄,多用于启动本应用中的component,因为这种方式需要提前获知目标组件类的全限定名。而隐式Intent则通过Intent中的action,category,data属性指定目标组件需要满足的若干条件, 系统筛选出满足所有条件的component,从中选择最合适的component或者由用户选择一个component作为目标组件启动。
如果Intent中指定了ComponentName属性,则Intent的其他属性将被忽略。
action属性是一个字符串, 代表某一种特定的动作. Intent类预定义了一些action常量, 开发者也可以自定义action. 一般来说, 自定义的action应该以application的包名作为前缀, 然后附加特定的大写字符串, 例如"cn.xing.upload.action.UPLOAD_COMPLETE"就是一个命名良好的action.
Intent类的setAction()方法用于设定action, getAction()方法可以获取Intent中封装的action.。有一些预定义的。
category属性也是一个字符串,用于指定一些目标组件需要满足的额外条件。Intent对象中可以包含任意多个category属性。Intent类也预定义了一些category常量,开发者也可以自定义category属性.
Intent类的addCategory()方法用来添加Category属性,getCategories()方法用于获取其中封装的所有category。
以下是Intent类中预定义的部分category:
Intent类的setData()方法用于设置data属性,setType()方法用于设置data的MIME类型,setDataAndType()方法可以同时设定两者。可以通过getData()方法获取data属性的值,通过getType()方法获取data的MIME类型。
通过Intent启动一个component时,经常需要携带一些额外的数据过去。携带数据需要调用Intent的putExtra()方法,该方法存在多个重载方法,可用于携带基本数据类型及其数组,String类型及其数组,Serializable类型及其数组,Parcelable类型及其数组,Bundle类型等。
Serializable和Parcelable类型代表一个可序列化的对象,Bundle与Map类似,可用于存储键值对。
flag属性是一个int值,用于通知android系统如何启动目标activity,或者启动目标activity之后应该采取怎样的后续操作。所有的flag都在Intent类中定义,部分常用flag如下:
IntentFilter类
IntentFilter类表示Intent过滤器,大部分情况下,每一个component都会定义一个或多个IntentFilter, 用于表明其可处理的Intent。一般来说,component的IntentFilter应该在AndroidManifest.xml文件中定义。
定义的方法: 在<activity>,<receiver>,<service>元素中增加一个或多个<intent-filter>子元素,如:
<!-- 声明作为程序入口的Activity --> <activity android:name=".FirstActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
IntentFilter与隐式Intent
android系统处理隐式Intent时,会比较Intent和IntentFilter的action,data,category属性,如果以上3个属性全都相符的话,则IntentFilter所属的component就可以作为目标组件的候选(存在多个符合条件的component时)。
1. 测试action属性:
intent最多只能定义1个action,而filter可以定义1个或多个action
通过action测试的条件为:
2. 测试category属性:
intent可以任意多个category,filter也可以任意个category
通过category测试的条件为:
3. 测试data属性:
intent最多只能定义1个data,filter则可以定义多个data
通过data测试的条件为:
data属性是一个URI,URI中包含scheme,host,post和path,典型的URI为:scheme://host:port/path
scheme,host,post和path都是可选的。比较2个data时,只比较filter中包含的部分。比如filter的一个data只是指定了scheme部分,则测试时只是比较data的scheme部分,只要两者的scheme部分相同,就视为"相同的data"。
标签:blog undle 条件 app home on() 包名 start name
原文地址:http://www.cnblogs.com/keyarchen/p/6062877.html