IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> IntentFilter隐式匹配规则 -> 正文阅读

[移动开发]IntentFilter隐式匹配规则

IntentFilter隐式匹配规则

启动Activity时一般有隐式匹配和显示匹配两种方法,这个重点讲一下Intent的隐式匹配规则,匹配规则主要分为三部分,action匹配,category匹配,和data匹配。

在正式说明匹配规则前需要知道以下几点:

  1. 一个Activity可以在AndroidMainFest文件中有多个intent-filiter,每个intent-filiter可以设定多个action,category和data
  2. 只有一个intent同时满足action,category和data的匹配规则时才算匹配成功。
匹配方式匹配规则
action匹配Intent的action必须和AndroidMainFest文件中intent-filiter设定的其中一个action相匹配
category匹配intent拥有的多个category必须都要与清单文件里的匹配,在startActivity时系统会默认给Intent加上"android.intent.category.DEFAULT,这也是为什么intent不设置category时,有时也会匹配成功的原因
data匹配intent中设置的data必须和AndroidMainFest文件中intent-filiter设定的其中一个data相匹配

data拥有很多的属性

属性作用
android:scheme协议,比如http,file,content等,其中content和file是默认值
android:hostIP地址,比如www.baidu.com
android:port端口号
android:path完整路径
android:pathPattern也是完整路径只不过可以正则加通配符。比如“*”,表示0个或多个任意字符
android:pathPrefix表示路径的前缀信息
scheme://host:port/[path | pathPattern | pathPrefix]

==注:==对与Service和BroadcastReceiver匹配规则也一样,只不过官方对于Service更建议使用显示的方式来启动服务。

匹配过程中的一些判断

                //判断是否该Intent可以隐式匹配成功,不成功返回null
                ResolveInfo r = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
                //查找可以匹配成功的所有的Activity的信息
                List<ResolveInfo> rs = getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);

这两个方法的第二个参数一般是PackageManager.MATCH_DEFAULT_ONLY
因为在startActivity时会默认给Intent的category加上Default,如果你在AndroidManifest文件中没有加Default,就必然匹配失败。

举个例子
加入有一个Activity1,他的action是“a”, 他的category是“b”,你构建了以下Intent

Intent intent = new Intent("a");
intent.addCategory("b");
 //判断是否该Intent可以隐式匹配成功,不成功返回null
ResolveInfo r = getPackageManager().resolveActivity(intent,PackageManager.MATCH_ALL);
startActivity(intent);

如果第二个参数设置为Match_All,就算r不等于null,依然会匹配失败。因为漏算了startActivity给Intent加上的Default

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:51:20  更:2022-02-05 21:53:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:00:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码