android-Intent and IntentFilter

知识为进步之母,而进步又为富强之源泉。这篇文章主要讲述android-Intent and IntentFilter相关的知识,希望能为你提供帮助。
一、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常量及对应的字符串如下:

android-Intent and IntentFilter

文章图片
android-Intent and IntentFilter

文章图片

 
上述Action、Category常量在java文件中直接用即可,不需要在AndroidManifest.xml中配置。
六、data、Type属性与intent-filter配置
【android-Intent and IntentFilter】 

    推荐阅读