scheme的配置的原理

scheme的配置的原理
熊猫不是猫本文只是记录,不是个人写的博客,内容为豆包AI生成,仅供参考。
在 Android 中,<intent-filter> 里的 scheme(以及配套的 host、pathPrefix 等)是意图匹配机制的核心配置,其本质是为 App 声明“能响应哪些类型的 Intent 请求”,从而实现“外部唤起 App/指定页面”的能力。下面从核心原理、scheme 分类(自定义 Scheme + App Link)、匹配规则、底层逻辑四个维度拆解:
一、核心原理:Intent 匹配与系统路由
Android 的 Intent(意图)是组件间通信的核心,而 <intent-filter> 是 App 向系统“注册能力”的方式:
- 当外部(如浏览器、其他 App、系统)发送
ACTION_VIEW类型的 Intent 时,系统会解析 Intent 中的data部分(包含 scheme、host、path 等); - 系统遍历所有已安装 App 的
<intent-filter>配置,匹配“能处理该 data 的 App”; - 匹配成功后,系统会唤起对应的 App/Activity(若多个 App 匹配,会弹出选择框)。
scheme 是 data 中最基础的匹配维度,定义了“数据的协议类型”,比如 http、https、tel、mailto,或自定义的 tencent1112xxxxxxllk。
二、两类 Scheme 配置的具体原理
你代码中包含两种典型 Scheme 配置:自定义 Scheme 和 App Link(HTTPS Scheme),原理上有共性也有差异:
1. 自定义 Scheme(tencent1112xxxxxxllk)
1 | <data android:scheme="tencent1112xxxxxxllk" /> |
核心原理:
- 属于自定义协议,不受域名归属限制,只要 App 声明了该 Scheme,系统就能匹配到;
- 用途:主要用于“App 间唤起”(如其他 App 跳转到你的 App),格式为
tencent1112xxxxxxllk://(可追加 host/path,如tencent1112xxxxxxllk://page/home)。
匹配逻辑:
只要外部 Intent 的 data.scheme 等于 tencent1112xxxxxxllk,且 Intent 的 action 是 VIEW、category 包含 DEFAULT + BROWSABLE,就会匹配到该 Activity。
特点:
- 无需验证域名归属,配置即生效;
- 缺点:安全性低(其他 App 可仿冒该 Scheme)、浏览器唤起时可能触发“选择打开方式”弹窗(而非直接唤起)。
2. App Link(HTTPS Scheme + autoVerify)
1 | <intent-filter android:autoVerify="true"> |
核心原理:
App Link 是 Android 6.0(API 23)引入的安全链接机制,本质是“将 HTTPS 域名与 App 绑定”,替代传统自定义 Scheme 的痛点:
- 协议基于标准
https,而非自定义字符串,更符合网页跳转逻辑; autoVerify="true"触发系统自动验证:系统会访问https://xxxx.qq.com/.well-known/assetlinks.json文件,验证该域名是否归属你的 App(通过 App 的签名指纹、包名校验);- 验证通过后,点击
https://xxxx.qq.com/app链接时,会直接唤起 App(无选择弹窗),而非打开浏览器;验证失败则降级为普通网页跳转。
匹配逻辑(多维度精准匹配):
外部 Intent 需同时满足:
scheme="https";host="xxxx.qq.com";path以/app开头(如/app、/app/detail);action=VIEW+category=DEFAULT+BROWSABLE。
三、Scheme 匹配的优先级与规则
- 匹配维度优先级:
scheme>host>pathPrefix/path/pathPattern→ 先匹配协议,再匹配域名,最后匹配路径; - 精确匹配优于模糊匹配:若一个
<intent-filter>配置了path="/app",另一个配置了pathPrefix="/app",则path="/app"会优先匹配精准路径; - 多 Intent-Filter 独立生效:你代码中两个
<intent-filter>是独立的,系统会分别匹配(即既响应自定义 Scheme,也响应 App Link 链接); - category 必须包含 DEFAULT:
category.DEFAULT是隐式 Intent 匹配的必要条件(系统会自动为隐式 Intent 添加该 category),缺少则无法匹配; - BROWSABLE 作用:允许该 Activity 被浏览器或其他可浏览组件唤起(比如点击网页中的链接),缺少则无法通过网页跳转唤起。
四、底层逻辑:系统如何处理 Scheme 唤起
- 外部触发:浏览器/其他 App 调用
Intent(Intent.ACTION_VIEW, Uri.parse("tencent1112xxxxxxllk://"))或Uri.parse("https://xxxx.qq.com/app"); - 系统解析:PackageManager 遍历所有 App 的 AndroidManifest.xml,解析其中的
<intent-filter>; - 匹配筛选:筛选出满足
action、category、data(scheme/host/path)匹配的 Activity; - 结果处理:
- 无匹配:抛出
ActivityNotFoundException; - 单个匹配:直接唤起该 Activity;
- 多个匹配:弹出“选择打开方式”对话框(App Link 验证通过后可跳过此步);
- 无匹配:抛出
- App Link 验证流程:
1
配置 autoVerify="true" → 系统访问域名下的 assetlinks.json → 校验签名/包名 → 验证通过→直接唤起;验证失败→走普通匹配
五、关键注意事项
- 自定义 Scheme 建议加唯一标识(如你的包名/腾讯 App ID),避免与其他 App 冲突;
- App Link 需确保
assetlinks.json可访问、格式正确(包含 App 包名、签名的 SHA256 指纹); - 测试 App Link 需用正式签名包(debug 签名的验证逻辑不同);
- 若需传递参数,可在 Scheme 后追加 query,如
tencent1112xxxxxxllk://?id=123或https://xxxx.qq.com/app?id=123,在 Activity 中通过getIntent().getData().getQueryParameter("id")获取。
总结:Scheme 本质是 App 向系统注册的“唤起协议”,自定义 Scheme 简单但安全性低,App Link 基于 HTTPS 更安全且体验更好,两者可结合使用(如自定义 Scheme 用于 App 间内部唤起,App Link 用于网页唤起)。




