Intent详解
Intent封装Android应用程序需要启动某个组件的"意图",这里的"意图"即是操作。
它还是应用程序组件之间通信的重要媒介。
将"意图"封装的好处是程序只是想启动某种特征的组件,并不想和某个具体的组件耦合。
Intent可以启动Activity,Service,BroadcastReceiver的意图,不同组件有不同启动意图的方法。如下:
Intent启动不同组件的方法:
组件 | 启动方法 |
---|---|
Activity | StrtActivity(Intent intent) |
StrtActivityForResult(Intent intent,int requestCode) | |
Service | ComponentName startService(Intent service) |
boolean bindService(Intent service,ServiceConnection conn,int flags) | |
BroadcastReceiver | sendBroadcast(Intent intent) |
sendBroadcast(Intent intent,String receiverPermission) | |
sendOrderdBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initalExtras) | |
sendorderedBroadcast(Intent intent,String receiverPermission) | |
sendStickyBroadcast(Intent intent) | |
sendStickOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handle scheduler, int initialCode, String initialData, Bundle initialExtras) |
Intent属性
Intent大致包含以下几个属性:
1.Compoent:用于明确指定需要启动的目标组件。
2.Action:抽象动作。
3.Category:为Action增加额外的附加类别信息。
4.Data:向Action提供操作的数据。
5.Type:用于指定该Data所指定Uri对应的MIME类型。
6.Extra:用于多个Action之间进行数据交换。
7.Flag:用于为该Intent添加一些额外的控制旗标。
以上的7种属性都有对应的方法:setXXXXX和getXXXXX,来设置和取得属性值,其中Data和Type
的值会相互覆盖,即如果先设置Data的值,后设置Type的值,Data的值会被Type的值覆盖,反过来
也是这样,想既有Data的值也有Type的值,那么就要调用Intent的setDataAndType()方法。
显式Intent和隐式Intent
1.显示Intent:在代码中指定了具体属性来设置Intent的,这种是显式Intent。
// 显式创建Component
Component comp = new ComponentName(类名.this,类名.class);
// 创建Intent
Intent intent = new Intent();
// 设置属性值
intent.setComponent(comp);
startActivity(intent);
2.隐式Intent:没有指定具体属性,应用程序会根据Intent指定的规则去启动符合条件的组件。
隐式Intent的规则
Activity配置中的<Intent-filter.../>元素中配置了该Activity所能"响应"的Intent。其中每个属性都有
对应的XML子元素,其中:
1.Action 对应 0~N个<action.../>子元素,一个Intent只能有一个Action
2.Category 对应 0~N个<category.../>子元素,一个Intent可以有多个Category
3.Data 对应 0~N个<data.../>子元素,Type属性也是通过这个子元素设置的,其表现为
<data android:mimeType>
当配置以上的属性子元素后,在调用设置属性方法setXXXXX的时候直接传入XML子元素的属性字符串,最后
调用startActivity(intent)即可启动响应的Intent!
隐式Intent的使用
Activity配置有以下Intent规则:
<intent-filter>
<!-- 指定该Activity能响应action为指定字符串的Intent -->
<action android:name="包名.intent.action.XXXXX_ACTION">
<!-- 指定该Activity能响应category为指定字符串的Intent -->
<category android:name="包名.intent.category.XXXXX_CATEGORY">
<!-- 指定该Activity能响应category为指android.intent.category.DEFAULT的Intent -->
<category android:name="android.intent.category.DEFAULT">
</intent-filter>
在代码中使用以上定制规则的Intent:
Intent intent = new Intent();
// 设置Action值,设置的值是规则中制定的值
intent.setAction(类名.XXXXX_ACTION);
// 设置Category值,设置的值是规则中制定的值
intent.setCategory(类名.XXXXX_CATEGORY);
// 执行意图
startActivity(intent);