我的编程空间,编程开发者的网络收藏夹
学习永远不晚

萌新Android笔记----IntentFilter匹配篇

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

萌新Android笔记----IntentFilter匹配篇

开个头

101要从黄铜调回黑铁了,太难了呀,都怪匹配给到的队友天天拉胯。。。(上单头铁盖伦打wn)。。Android的匹配机制也是给萌新当头一棒。但萌新突出一个莽字,不知道的东西就冲塔搞他。。首先我们萌新知道的启动activity分为两种,显式调用和隐式调用。原则上一个Intent不能即是显式调用又是隐式调用,两者真共存的话以显式调用为主。
显式调用
需要明确指定被启动对象的组件信息,包括包名和类名。例如:

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

隐式调用
不需要明确指定组件信息。但需要Intent能匹配目标组件的IntentFilter中所设置的过滤信息,这些过滤信息有action,category,data,(这些属性是在AndroidMenifest里设置的)举个栗子吧:

//MainActivity里的第一个intentfilter
//MainActivity里的第二个intentfilter

为了匹配过滤列表,需要同时匹配过滤列表中的action,category,data信息,否则匹配失败。值得一提的是一个过滤列表中的action,category和data可以有多个,而一个activity可以有多组过滤列表,如上。一个intent只有同时匹配一组intentfilter才能成功启动对应的activity。接下来就一一介绍下各种属性 匹配规则吧

action的匹配规则
action是一个字符串,我们可以自己写,也可以用系统预定义的action。action的匹配规则是action的字符串值必须完全一样,只要和一组intentfilter的任意一个action匹配就ok,但如果intent中没有指定action就会导致匹配失败。
ps:action区分大小写,大小写不同会导致匹配失败。 category的匹配规则
category同样是一个字符串,同action我们可以自己写,也能用系统给的。但category的匹配规则和action有很大不同,在intent里action必须有,category可以没有也可以有2个及以上,,但如果往intent里设置了category,他或他们就必须和一个filter中的category相同。除此之外,萌新发现两个IntentFilter里都有

看这DEFAULT应该就能猜出大半,我们不往intent里加category,系统加啊,加的就是上面这行。所以为了我们的activity能接收隐式调用,就必须在intent-filter中指定上面这个category。

data的匹配规则
data的匹配规则和action类似,如果过滤规则中定义了data,那么Intent中也必须得定义可匹配的data。首先来看下data的语法

data由两部分组成,mimeType和URI。mimeType指媒体类型,可以表示图片,文本,视频等不同的媒体格式(说白了就是告诉你绑定了啥后缀的东西)而URI(路径)的结构就有意思了,她长这样

://:/[||]

举个栗子

http://www.baidu.com:80/search/info

Scheme ☞ URI的模式,比如http,file,content,如果不指定scheme,那么URI其他参数都无效,最终URI无效。
Host ☞ URI的主机名,比如www.baidu.com,host未指定也会导致URI无效。
Port ☞ 这是URI的端口号,比如上头的80
PathPathPatternpathPrefix ☞ 这Ⅲ代表了路径信息,path表示完整的路径,pathPattern也表示完整路径,但他可以包含“”,“”表示0个或多个字符(比如“image/*”意思就是指定了媒体类型为所有的图片),pathPrefix表示路径的前缀信息。
data的匹配分两者情况

只给了mimeType没给URI

例如:


	.......

那么Intent里的mimeType必须是"image/*"才能匹配。此外,这种情况下虽然没指定URI,但有默认值,URI默认值为content和file,所以我们即使不想通过URI指定也得在intent设置的时候把intent中的URI部分的scheme设置为content或file才能成功匹配。我们可以这么写

intent.setDataAndType(Uri.parse("file://abc"),"image/png")

有必要提一句,如果要为Intent指定完整的data,不能先用setData再用setType,因为他们彼此会清除对方的值,要用setDataAndType。

既有mimeType又有URI
例如

这种情况下每个data都指定了完整的属性值,既有URI又有mimeType。所以我们可以这么写

intent.setDataAndType(Uri.parse("http://abc"),"video/mpeg")

出了以上特点,data还有一点和action不一样


这两种写法,作用是一样的。
还有就是千万别忘了我们如果没设置scheme的话,他是有默认值的。默认值是file和content,这点很重要。setDataAndType的时候不能忘了这点。

总结:萌新常用的是隐式匹配方式,但实际上是显式匹配更准确,好用。但实际上intentfilter有什么用呢?简单来讲filter是处理活动的必须步骤,比如你发送一个intent希望这个activity打开一个网页,就要用到intentfilter,action表示了这个activity接收到intent后要干啥,category像安检,你得给出身份证明才能通过,而data更像是甲方,他想要啥你就得给啥,严格的甲方连具体的URI需求都给出来,宽松的送钱的甲方只说了mimeType格式,只要满足这个格式就能过关。如果想取出data里的东西我们可以用getData,想取出type就用getType。


作者:she_mayber


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

萌新Android笔记----IntentFilter匹配篇

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

萌新Android笔记----IntentFilter匹配篇

开个头 101要从黄铜调回黑铁了,太难了呀,都怪匹配给到的队友天天拉胯。。。(上单头铁盖伦打wn)。。Android的匹配机制也是给萌新当头一棒。但萌新突出一个莽字,不知道的东西就冲塔搞他。。首先我们萌新知道的启动activity分为两种,
2022-06-06

萌新Android笔记----Activity的启动模式

Activity的启动模式 2020 3 18,天气晴,是个巩固基础摸鱼的好日子,于是萌新兴冲冲写个二次元老婆能来回显示的app,但发现越运行越卡啊。这就涉及到了activity的启动模式问题。 Android的栈 我们首先要知道的是act
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录