一、Intent简介
Android使用Intent来封装程序的调用“意图”,Activity、Service、BroadcastReceiver三种重要的组件都是依靠Intent来启动的,很明显使用Intent提供了一致的编程模型;使用Intent还有一个好处是,在某些时候应用程序只是想启动具有某些特征组件,并不想和某个具体的组件耦合,如果使用形如startActivity(Class activityClass)的方法来启动特定的组件,势必造成一种硬编码耦合,这样也不利于高层次的解耦。
二、Intent启动不同组建的方法
Activity : startActivity(Intent intent)
startActivityForResult(Intent intent,int requestCode)
Service : ComponentName startService(Intent Service)
boolean bindService(Intent Service,ServiceConnection,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)
sendStickyBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,
int initialCode,String initialData,Bundle initialExtras)
三、Intent对象的属性
Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动制定组件,至于具体启动哪个组件取决于Intent的各个属性。
Intent属性大致包括:Component、Action、Category、Data、Type、Extra 、Flag;
1、Component属性用于明确(显示启动)指定需要启动的目标组件;
2、Action代表该Intent所要完成的一个抽象动作,这个动作具体由哪个组件来完成则取决于Activity的<intent-filter.../>配置,其属性的值是一个普通的字符串;需要注意的是一个Intent对象最多只能包括一个Action属性,设置Action属性的方法:setAction(MainActivity.KK_ACTION);。
3、Category用于为Action增加额外的附加类别信息,通常会与Action属性结合使用,其属性值也是一个普通的字符串;一个Intent对象可以包括多个Category属性,程序可调用Intent的addCategory(String str)方法为Intent添加该属性。通过Intent调用Activity时,Android默认会自动添加CATEGORY_DEFAULT类别属性,故在Filter配置中CATEGORY_DEFAULT是不可缺少的;
4、
5、
6、Extra属性用于“携带”需要交换的数据
7、
<intent-filter.../>元素里通常包含如下子元素:
0~N个<action.../>子元素;
0~N个<category.../>子元素;
0~1个<data.../>子元素。
四、Action、Category与intent-filter配置
1、创建一个Android工程时配置文件AndroidManifest.xml中的intent-filter标签中会自动生成两个子元素:
<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />;那么这两个子元素代表什么?
我们都知道一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢?有些程序可能需要显示在程序列表里,有些不需要,该如何定义?首先,android.intent.action.MAIN决定应用程序最先启动的Activity, 其次由android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里,也就是说这两者是配合使用的。
2、为什么加入android.intent.category.DEFAULT?
每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 "android.intent.category.DEFAULT
",所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 "android.intent.category.DEFAULT
" category,不然将导致 Intent 匹配失败。一个 Intent 可以有多个 category,但至少会有一个,也是默认的一个 category。 只有 Intent 的所有 category 都匹配上,Activity 才会接收这个 Intent。
3、getAction()与getCategories()
String action=getIntent().getAction(); 获取该Activity对应的Intent的Action属性
Set<String> cates=getIntent().getCategories(); 获取该Activity对应的Intent的Category属性
五、指定Action、Category调用系统Activity
Intent代表了启动某个程序组件的意图,实际上Intent对象不仅可以启动本应用内程序组件,也可以启动Android系统的其他应用程序的组件,包括系统自带的程序组件(只要权限允许)。Android内部提供了大量标准的Action、Category常量,其中用于启动Activity的标准Action常量及对应的字符串如下:
上述Action、Category常量在java文件中直接用即可,不需要在AndroidManifest.xml中配置。
六、data、Type属性与intent-filter配置