Android进阶(二十九) 走近 IntentFilter

文章目录

    • 一、什么是IntentFilter ?
    • 二、IntentFilter 如何过滤隐式意图?
      • 2.1 动作测试
      • 2.2 类别测试
      • 2.3 数据测试

一、什么是IntentFilter ?

如果一个 Intent 请求在一片数据上执行一个动作, Android 如何知道哪个应用程序(和组件)能用来响应这个请求呢?

IntentFilter就是用来注册 ActivityServiceBroadcast Receiver 具有能在某种数据上执行一个动作的能力。

使用 IntentFilter ,应用程序组件告诉 Android ,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。

IntentFilter翻译成中文就是“意图过滤器”,主要用来过滤隐式意图。当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以响应该操作的组件,服务。

例如:当用户点击PDF文件的时候,Android系统就会通过设定好的意图过滤器,进行匹配测试。找到能够打开PDF文件的APP程序。

代码:

<activity android:name="com.example.testmain.ShowActivity" ><intent-filter><action android:name="test.update.mydata" /><category android:name="my.test.show" /><data android:pathPattern=".*\\.jpg" android:scheme="http" /></intent-filter>
</activity>

二、IntentFilter 如何过滤隐式意图?

Android系统会根据配置的Intent Filter(意图过滤器),来进行匹配测试。匹配的时候,只会考虑三个方面:动作数据(URI以及数据类型)和类别。也就是说Android系统会进行“动作测试”,“数据测试”,“类别测试”,来寻找可以响应隐式意图的组件或服务。

另外,当对其他App程序开放组件和服务的时候也需要配置Intent Filter(意图过滤器),一个Activity可以配置多个<intent-filter>

2.1 动作测试

对应<intent-filter>中的<action/>标签;

  1. 如果<intent-filter>标签中有多个<action/>,那么Intent请求的Action,只要匹配其中的一条<action/>就可以通过了这条<intent-filter>的动作测试。

  2. 如果<intent-filter>中没有包含任何<action/>,那么无论什么Intent请求都无法和这条<intent-filter>匹配。

  3. 如果Intent请求中没有设定Action(动作),那么这个Intent请求就将顺利地通过<intent-filter>的动作测试(前提是<intent-filter>中必须包含有<action/>,否则与第二条冲突)。

2.2 类别测试

对应<intent-filter>中的<category />标签;

Intent中的类别必须全部匹配<intent-filter>中的<category />,但是<intent-filter>中多余的<category />将不会导致匹配失败。

例如:Intent中有3个类别,而意图过滤器中定义了5个,如果Intent中的3个类别都与过滤器中的匹配,那么过滤器中的另外2个,将不会导致类别测试失败。

在这里插入图片描述

注意:有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:“android.intent.category.DEFAULT” (CATEGORY_DEFAULT常量)。 因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)

2.3 数据测试

对应<intent-filter>中的<data>标签;

<data>元素指定了可以接受的Intent传过来的数据URI和数据类型,当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。

例如:

如果过滤器仅指定了一个scheme,所有该schemeURIs都能够和这个过滤器相匹配;

如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;

如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。
比较规则如下:

  1. 一个既不包含URI也不包含数据类型的意图对象,仅在过滤器也同样没有指定任何URI和数据类型的情况下才能通过测试。

  2. 一个包含URI但没有数据类型的意图对象,仅在它的URI和一个同样没有指定数据类型的,过滤器里的URI匹配时才能通过测试。这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。

  3. 一个包含数据类型但不包含URI的意图对象,仅在这个过滤器列举了同样的数据类型,而且也没有指定一个URI的情况下才能通过测试。

  4. 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI,而且这个过滤器没有指定一个URI,那么它也能通过测试。换句话说,一个组件被假定为支持”content: 数据“ 和 “file: 数据”,如果它的过滤器仅列举了一个数据类型。

例如AndroidManifest.xmlAndroidManifest.xml是安卓开发中主配置文件,程序执行首先浏览这个文件的内容)中有:

对于<intent-filter>中的action项可以有多个只要匹配其中一个就可以了

intent.setAction("com.nanlove.wangshiming");//中的action也可以为wangshimingintent.addCategory("wangshiming.intent.category")// 代码中的addCategory并不用写因为android他有默认的category 只要配置清单中存在<category android:name="android.intent.category.DEFAULT" />就可以了.

没有 “数据参数” 的情况下只要意图对象中的设置动作和类别都出现在intent-filter就能跟filter匹配,但是有数据<data android:scheme="love" android:host="hao123.com" android:port="888" android:path="/MM" />数据项一定要完全匹配。

当数据和数据类型 android:mimeType="text/plain"同时存在的时候,不能使用intent.setData(Uri.parse("love://hao123.com:888/MM")) ;

因为setData的方法会自动清除前面的数据类型:This method automatically clears any type that was previously set by setType;

所以后面的setType就无法匹配,应该使用intent.setDataAndType(Uri.parse("love://hao123.com:888/MM"), "text/plain");

提示:在同一个应用内,能使用显示意图,就尽量使用显示意图,增加程序的效率,理论上隐式意图匹配规则是需要花时间寻找的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页数据的解析提取(XPath的使用----lxml库详解)

在提取网页信息时&#xff0c;最基础的方法是使用正则表达式&#xff0c;但过程比较烦琐且容易出错。对于网页节点来说&#xff0c;可以定义id、class或其他属性&#xff0c;而且节点之间还有层次关系&#xff0c;在网页中可以通过XPath或CSS选择器来定位一个或多个节点。那么&…

Maven管理项目,本地仓库有对应的jar包,但还是报找不到

文章目录 业务场景错误提示分析过程解决办法 业务场景 settings.xml种配置了私服&#xff0c;但是有些依赖私服上没有&#xff0c;通过同事拷贝过来的。但是用maven打包时报红了。 错误提示 Idea Maven错误&#xff1a;was cached in the local repository, resolution will…

RecycleView结合ItemTouchHelper实现拖动排序

最近项目中需要实现对某一类条目进行拖动排序功能&#xff0c;实现技术方案就是利用ItemTouchHelper绑定RecyclerView、ItemTouchHelper.Callback来实现UI更新&#xff0c;并且实现动态控制是否开启拖动功能。其中&#xff0c;ItemTouchHelper是Google在androidx包中添加的&…

int128的实现(基本完成)

虽然有一个声明叫_int128但是这并不是C标准&#xff1a; long long 不够用&#xff1f;详解 __int128 - FReQuenter - 博客园 (cnblogs.com) 网络上去找int128的另类实现方法&#xff0c;发现几乎都是在介绍_int128的 然后我就自己想了个办法&#xff0c;当时还没学C&#xf…

Spring Boot中实现列表数据导出为Excel文件

点击下载《Spring Boot中实现列表数据导出为Excel文件》 1. 前言 本文将详细介绍在Spring Boot框架中如何将列表数据导出为Excel文件。我们将通过Apache POI库来实现这一功能&#xff0c;并解释其背后的原理、提供完整的流程和步骤&#xff0c;以及带有详细注释的代码示例。最…

关于设备连接有人云的使用及modbus rtu协议,服务器端TCP调试设置

有人云调试 调试过程问题1. 关于modbus rtu协议,实质上有三种modbus基本原理modbus 格式2. 关于modbus crc16通信校验3. 关于在ubuntu阿里云服务器端,监听网络数据之调试mNetAssist之前的一个项目,再拿出来回顾下。 调试过程 先 要在有人云,用手机号注册一个服务账号,官网显…

家的情感记忆:如何用壁纸讲述你的墙故事?

1、方小童在线工具集 网址&#xff1a; 方小童 该网站是一款在线工具集合的网站&#xff0c;目前包含PDF文件在线转换、随机生成美女图片、精美壁纸、电子书搜索等功能&#xff0c;喜欢的可以赶紧去试试&#xff01;

HarmonyOS—使用预览器查看应用/服务效果

DevEco Studio为开发者提供了UI界面预览功能&#xff0c;可以查看应用/服务的UI界面效果&#xff0c;方便开发者随时调整界面UI布局。预览器支持布局代码的实时预览&#xff0c;只需要将开发的源代码进行保存&#xff0c;就可以通过预览器实时查看应用/服务运行效果&#xff0c…

探索分布式强一致性奥秘:Paxos共识算法的精妙之旅

提到分布式算法&#xff0c;就不得不提 Paxos 算法&#xff0c;在过去几十年里&#xff0c;它基本上是分布式共识的代名词&#xff0c;因为当前一批常用的共识算法都是基于它改进的。比如&#xff0c;Fast Paxos 算法、Cheap Paxos、Raft 算法等。 由莱斯利兰伯特&#xff08;L…

Spring6学习技术|AOP

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; AOP AOP&#xff08;Aspect Oriented Programming&#xff09;是一种设计思想&#xff0c;是软件设计领域中的面向切面编程&#xff0c;它是面向对象编程的…

AIDL的工作原理与使用示例 跨进程通信 远程方法调用RPC

AIDL的介绍与使用 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android中用于定义客户端和服务端之间通信接口的一种接口定义语言。它允许你定义客户端和服务的通信协议&#xff0c;用于在不同的进程间或同一进程的不同组件间进行数据传递。AIDL通过…

深入探讨YUV图像处理:理论原理与OpenCV实践

文章目录 导言YUV模型的原理使用OpenCV处理YUV图像1. 读取YUV图像2. 将YUV图像转换为RGB图像3. 将RGB图像转换为YUV图像 结语 导言 导言&#xff1a; 在图像处理领域&#xff0c;YUV色彩模型因其对亮度和色度的分离而被广泛使用&#xff0c;特别在视频编码和实时通信中发挥了巨…

算法项目(3)—— 从零实现KNN、朴素贝叶斯垃圾邮件分类

本文包含什么? 项目运行的方式项目代码,自己实现KNN算法以及朴素贝叶斯算法.代码介绍运行有问题? csdn上后台随时售后.项目说明 本文主要是自己从0实现KNN算法以及朴素贝叶斯算法.然后使用英文垃圾邮件数据集进行垃圾邮件分类.常见的代码均调用sklearn库来实现,本文自行实现…

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.01.01-2024.01.10

1.Pre-trained Large Language Models for Financial Sentiment Analysis 标题:用于金融情感分析的预训练大型语言模型 author:Wei Luo, Dihong Gong date Time:2024-01-10 paper pdf:http://arxiv.org/pdf/2401.05215v1 摘要&#xff1a; 金融情感分析是指将金融文本内容划分…

从零学习Linux操作系统第二十八部分 shell脚本中的执行流控制

一、什么是执行流、循环执行流 执行流&#xff1a;改变执行顺序&#xff0c;使之更方便操作者 循环执行流&#xff1a;根据脚本是执行流再某一个状态下进行循环执行&#xff0c;进行多次执行后再往下走&#xff08;for语句&#xff09; for语句 作用 为循环执行动作 for语句…

opencv判断灰化情况

目的 先说说理论&#xff1a; 在图像处理中&#xff0c;用RGB三个分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即红、绿、蓝三原色来表示真彩色&#xff0c;R分量&#xff0c;G分量&#xff0c;B分…

LeetCode LCR 055.二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

vue实现拖拽(vuedraggable)

实现效果: 左侧往右侧拖动&#xff0c;右侧列表可以进行拖拽排序。 安装引用&#xff1a; npm install vuedraggable import draggable from vuedraggable 使用&#xff1a; data数据&#xff1a; componentList: [{groupName: 考试题型,children: [{componentType: danxua…

SQLite 的使用

SQLite 是一个轻量级、自包含和无服务器的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于嵌入式系统、移动应用程序和小中型网站。它易于创建、需要的配置较少&#xff0c;并且提供了用于管理和操作数据的强大功能集。本文&#xff0c;我们将带领你…

电路设计(26)——交通信号灯的multism仿真

1.功能要求 使用数字芯片设计一款交通信号灯&#xff0c;使得&#xff1a; 主干道的绿灯时间为60S&#xff0c;红灯时间为45S 次干道的红灯时间为60S&#xff0c;绿灯时间为45S 主、次干道&#xff0c;绿灯的最后5S内&#xff0c;黄灯闪烁 使用数码管显示各自的倒计时时间。 按…