当前位置: 首页 > 科技观察

IntentFilter匹配规则详解

时间:2023-03-23 12:01:44 科技观察

前言在日常的Android开发中,我们都会用到IntentFilter的匹配规则。IntentFilter的主要规则分为三类:action、category、data。只有完美匹配才能成功启动目标Activity;今天我们来解释一下;一、Activity的调用方式Activity的调用方式分为显式调用和隐式调用两种1、显式调用大多数情况下,我们最常接触到的就是显式调用:Intentintent=newIntent(FirstActivity.this,SecondActivity。班级);启动活动(意图);其实严格来说,这并不是显式调用,因为在显式调用的意义上,需要明确要启动的对象的组件信息,包括包名和类名,并没有此处的包名称:Intentintent=newIntent(Intent.ACTION_MAIN);intent。addCategory(Intent.CATEGORY_LAUNCHER);ComponentNamecn=newComponentName("com.test","com.test.MainActivity");intent.setComponent(cn);startActivity(intent);2、隐式调用需要Intent匹配目标组件IntentFilter中设置的过滤信息。如果不匹配,则无法启动目标Activity;Intentintent=newIntent();intent.setAction("android.intent.action.View");startActivity(intent);二、IntentFilter匹配规则详解1、Action匹配规则action是一个字符串,系统预先定义了一些动作,我们也可以在应用中定义自己的动作;它的匹配规则是Intent中的action必须能够匹配到filter规则中的action,这里指的是action的字符串值完全一致;动作中的内容区分大小写;如果Intent中没有指定action,则视为匹配失败;如果过滤规则中有多个操作,则所以只要Intent中的action可以和Activity过滤规则中的任意一个action相同,就可以匹配成功;btn_skip_b.setOnClickListener{//点击A中的按钮启动Bvaritent=Intent()intent.action="com.ysl.test"startActivity(intent)}commonaction如下(Intent类中的常量):Intent.ACTION_MAIN,标识Activity作为一个程序的开始。Intent.ACTION_VIEW,显示用户数据。意图.ACTION_DIAL。CK,从列表中选择信息,一般用于选择联系人或图片等。Intent.ACTION_ANSWER,处理来电Intent.ACTION_CHOOSER,显示一个Activity选择器,比如常用的选择分享到哪里2、分类匹配规则category是一个string,系统预先定义了一些类别,我们也可以在应用中定义自己的类别;类别的匹配规则是:Intent中不能没有类别,但是一旦有类别,不管有多少,每一个都能够匹配过滤规则中的任意一个类别;一个Intent中可以设置多个categories,Intent中的所有categories都必须匹配Activity;也可以不设置category,系统会自动匹配android.intent.category.DEFAULT;这个可能感觉和action很像,但是只要稍加注意就会发现Intent就是setAction和addCategory,也就是说只有一个action(注意一个Intent里面只有一个action,但是在一个Activity的intent-filter中可以有多个actions),并且可以有很多类别并且所有的类别都必须出现在Activity的类别集中;注意:因为一个Activity必须要有一个,所以我们不需要在intent中添加这个类别来匹配;如果只有addCategory没用,必须在setAction之后做;Intentintent=newIntent();intent.addCategory("com.yu.hu.category1");intent.addCategory("com.yu.hu.category2");intent.setAction("com.yu.hu.what");startActivity(intent);3、数据的匹配规则data的匹配规则:Intent中必须包含data数据,data数据可以完全匹配过滤规则中的某条数据;数据的语法格式mimeType="string"/>数据由两部分组成:mimeType和URI,URI通过以下格式,包括scheme、host、port、path、pathPrefix和pathPattern;://:/[||]具体参数解释:mimeType:指媒体类型,如image/jpeg、audio/mpeg4-generic、vidio/等,可以表示不同的媒体格式如图片、文字、视频等;scheme:URIpattern,如http、file、content等,如果在URI中没有指定scheme,那么整个URI的其他参数都是无效的,也意味着这个URI是无效的;host:URI的主机名,如blog.csdn.net,如果不指定host,则整个URI中的其他参数无效,也意味着该URI无效;port:URI中的端口号,例如80,当文件URI中指定了scheme和host参数时,port参数才有意义;path:表示路径的完整信息;pathPrefix:表示路径的前缀信息;pathPattern:表示路径的完整信息,但可以包含通配符*,表示0或任意字符;数据URI不能设置,但如果设置,则必须设置scheme和host属性;URI的scheme属性有默认值,默认值为contentorfile,因此,即使intent-filter中的数据没有设置URI,匹配时也需要设置scheme和host属性,scheme属性的值必须是content或file;Intentintent=newIntent();intent.setData(Uri.parse("https://www.baidu.com:8080/imgs/img1.png"));开始活动(意图);三、IntentFilter概述1.IntentFilter匹配优先级勾选Intent过滤器(intent-filter),按照如下优先级关系进行查找:action->data->category;2.隐含意图;每次通过startActivity()方法发送的隐式Intent至少有一个类别,就是android.intent.category.DEFAULT,所以只要是要接收隐式Intent的Activity都应该包含android.intent.category.DEFAULTcategory,否则会导致Intent匹配失败,如果一个Activity组件想要通过隐式Intent被其他组件调用,其在AndroiddManifest.xml中的声明如下:总结差不多就结束了这一年,大家只要努力学习,就能找到一份好工作;本文转载自微信公众号《Android开发编程》

最新推荐
猜你喜欢