IntentFilter匹配规则讲解

前言


Android启动activity有两种,显式调用跟隐式调用。显式调用大家平时用得比较多,调用时需要明确的指定被启动对象的组件信息,类名,隐式调用则不需要明确指定组件信息。

下面用代码来解释什么是显式启动。
A:显式启动

Intent intent=new Intent(MainActivity.this, SecondActivity.class); 
startActivity(intent);

B:隐式启动
隐式启动不同之处在于我们并不需要像Intent(MainActivity.this, SecondActivity.class)这样传参数然后再Start另一个Activity.我们需要在intent添加过滤器intentfilter。


	
		
		
	

这样,我们需要在启动另一个Activity的时候只需要如下方法就可以:

Intent intent=new Intent("com.test.info"); 
startActivity(intent);

隐式意图调用


由于显式意图启动大家用得比较多,这边主要讲解隐式意图调用。
过滤器IntentFilter中的过滤信息有action,category,data三种,下面是一个示例。

 
            
                
                
                
                
                
            
            
                
                
                
                
                
            
        

1.多个intent-filter的匹配规则

  • 一个activity可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter中的action,category,data即可成功启动activity。

2.action的匹配规则

  • 一个intent对象只能指定一个action,而一条< intent-filter>元素至少应该包含一个<
    action>,否则任何Intent请求都不能和该< intent-filter>匹配;

  • 一个intent对象的action和intent-filter中的任何一个action相同,不需要全部相同,即可匹配成功,另外action是区分大小写的;

  • 如果intent对象不指定action且< intent-filter>的action列表不为空,则匹配失败;

  • 如果< intent-filter>中action列表为空,则该activity无法被启动。

3.category的匹配规则

  • 一个intent对象可以指定多个category,但至少会有一个,也是默认的一个 category,“android.intent.category.DEFAULT”;

  • 如果一个intent定义了多个category,则每个category都要跟<
    intent-filter>中其中一个category相同;

  • intent可以没有category,这时候,也可以匹配成功。因为在startActivity或者startActivityForResult的时候,系统会默认跟intent加上“android.intent.category.DEFAULT”这个category,所以任何<
    intent-filter>中必须要有“android.intent.category.DEFAULT”这个category。

4 data的匹配规则

  • < intent-filter>没有定义data的时候,intent对象也可以不定义data,而一条< intent-filter>也可以定义多条data,匹配规则跟action一致;
    下面为URI的结构:< scheme>://< host>:< port>/[< path>|< pathPrefix>|< pathPattern>]
  • 如果没有定义URI,由于URI有默认值,为content和file,所以没有指定URI的,但是intent中的URI部分的scheme必须为content或者file。
  

则intent必须如下所示:

intent.setDataAndType(Uri.parse("file://abc"),"text/plain");
  • 为intent设置完整的data,必须用setDataAndType方法,不能分开用setData跟setType,因为上述两个方法会彼此覆盖。

如果< intent-filter>有多组完整data,则跟action一样,intent中主要匹配其中一个即可成功。


最上面的intent-filiter用如下的intent则可以启动成功。

Intent intent = new Intent("focus.teach.myapplication.movie");
intent.addCategory("focus.teach.myapplication.category.test");
intent.setDataAndType(Uri.parse("file://abc"),"image/jpeg");
startActivity(intent);

欢迎一起交流讨论
群号:469890293


关注我的公众号,更多优质文章将通过公众号推送。
微信扫一扫下方二维码即可关注:
IntentFilter匹配规则讲解_第1张图片

你可能感兴趣的:(android基础知识)