Android中的Intent使用
Intent在Android中主要用于启动其他组件,它的本意可以理解为“意图”。既可以用它来启动Activity、Service、BroadcastReceiver,同时还能在其中携带各种数据,实现各组件的交流。
使用Intnet启动系统组件的方法 | |
组件类型 | 启动方法 |
Activity |
startActivity(Intent intent) |
startActivityForResult(Intent intent)
| |
Service |
ComponentName startService(Intnet intent) |
boolean bindService(Intent service, ServiceConnection conn, int flags)
| |
BroadcastReceiver | sendBroadcast(Intent intent) |
sendBroadcast(Intent intent, String receiverPermission) | |
sendOrderedBroadcast (Intent intent, String receiverPermission) | |
sendOrderedBroadcast (Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) | |
sendStickyBroadcast (Intent intent) | |
sendStickyOrderedBroadcast (Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) |
Intent属性
主要有component、action、category、type、data、extra、flags
1. Component 启动组件的名字
构造器:
ComponentName(String pkg, String cls);
创建pkg所在包下的cls类所对应的组件;
ComponentName(Context pkg, String cls);
创建pkg所对应的包下的cls类所对应的组件;
ComponentName(Context pkg, Class<?> cls);
创建pkg所对应的包下的cls类所对应的组件;
ComponentName(Parcel in)
ComponentName的创建需要指定包名和类名,以确定唯一的类,Intent调用setComponent(ComponentNamename)使应用程序可以启动指定的组件。一般使用Intent intent = new Intent(Context packageContext, Class<?>cls)来指定启动组件更为方便。
Intent中还可以使用以下方法添加组件名:
setClass(Context packageContext,Class<?> cls)
setClassName(Context packageContext, StringclassName)
setClassName(String packageName, StringclassName)
显示意图:指定了组件包名和类名的Intent
隐式意图:有时需要执行一个任务(比如打开一个网页),并不需要详细的指定一个组件,可以通过对意图添加一些属性来隐式调用,系统会根据各个组件的Intent-filter属性来选择启动那些组件。(注意:如果没有满足条件的组件可以启动,程序是会崩溃的,所以要先检查是否有可以启动的组件)。
Intent可以通过添加Action、Category、Data、Type属性声明一个隐式意图来执行一个抽象的动作,系统会根据组件配置的<intent-filter>对应属性来选择启动哪些组件。
2. <intent-filter> Intent可以通过添加Action、Category、Data、Type属性声明一个隐式意图来执行一个抽象的动作,系统会根据组件配置的<intent-filter>对应属性来选择启动哪些组件。
Intent-filter可包含:
0~N个<actionandroid:name="" />
0~N个<categoryandroid:name=" " />
0~1个<data
可选属性:
miniType: 声明所能匹配的Intent的Type属性
scheme: 声明匹配的Itent的Data属性的scheme部分
host: 声明匹配的Itent的Data属性的host部分
port: 声明匹配的Itent的Data属性的port部分
path: 声明匹配的Itent的Data属性的path部分
pathPrefix: 声明匹配的Itent的Data属性的path前缀
pathPattern: 声明匹配的Itent的Data属性的path字符串模板
/>
3. Action 声明Intent所要完成的抽象动作
Intent.setAction(String action);
与<intent-filtet>的<actionandroid:name="" />匹配
4. Category用于为Action增加额外的附加类别信息
Intent. addCategory (String category);
与<intent-filtet>的<categoryandroid:name=" " />匹配
1个Intent只能包含一个Action,但可以包含多个Category,Action通常与Category结合使用。
5. Data 通常用于向Action属性提供操作的数据,该属性接受一个Uri对象
Intent.setData (Uri data);
与<intent-filtet>的<data>匹配
Uri为一种特定形式的字符串,满足如下格式
6. Type 用于指定该Data所指定Uri对应的MIME类型,可以为任意的MIME类型,只要符合adc/xyz格式的字符串即可。
Data属性与Type属性相互覆盖,具体情况如下:
Intent启动其他组件时会根据Intent的属性列出所有满足条件的intent-filter
7. Extra 为一个键值对的Bundle对象,用于不同Activity之间进行数据交换。
8. Flag 为该 Intent添加一些额外的控制旗标
Intnt.addFlags();