scheme的配置的原理

本文只是记录,不是个人写的博客,内容为豆包AI生成,仅供参考。

在 Android 中,<intent-filter> 里的 scheme(以及配套的 hostpathPrefix 等)是意图匹配机制的核心配置,其本质是为 App 声明“能响应哪些类型的 Intent 请求”,从而实现“外部唤起 App/指定页面”的能力。下面从核心原理scheme 分类(自定义 Scheme + App Link)、匹配规则、底层逻辑四个维度拆解:

一、核心原理:Intent 匹配与系统路由

Android 的 Intent(意图)是组件间通信的核心,而 <intent-filter> 是 App 向系统“注册能力”的方式:

  1. 当外部(如浏览器、其他 App、系统)发送 ACTION_VIEW 类型的 Intent 时,系统会解析 Intent 中的 data 部分(包含 scheme、host、path 等);
  2. 系统遍历所有已安装 App 的 <intent-filter> 配置,匹配“能处理该 data 的 App”;
  3. 匹配成功后,系统会唤起对应的 App/Activity(若多个 App 匹配,会弹出选择框)。

schemedata 中最基础的匹配维度,定义了“数据的协议类型”,比如 httphttpstelmailto,或自定义的 tencent1112xxxxxxllk

二、两类 Scheme 配置的具体原理

你代码中包含两种典型 Scheme 配置:自定义 SchemeApp 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 的 actionVIEWcategory 包含 DEFAULT + BROWSABLE,就会匹配到该 Activity。

特点:
  • 无需验证域名归属,配置即生效;
  • 缺点:安全性低(其他 App 可仿冒该 Scheme)、浏览器唤起时可能触发“选择打开方式”弹窗(而非直接唤起)。

2. App Link(HTTPS Scheme + autoVerify)

1
2
3
4
5
6
<intent-filter android:autoVerify="true">
<data
android:host="xxxx.qq.com"
android:pathPrefix="/app"
android:scheme="https" />
</intent-filter>
核心原理:

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 匹配的优先级与规则

  1. 匹配维度优先级scheme > host > pathPrefix/path/pathPattern → 先匹配协议,再匹配域名,最后匹配路径;
  2. 精确匹配优于模糊匹配:若一个 <intent-filter> 配置了 path="/app",另一个配置了 pathPrefix="/app",则 path="/app" 会优先匹配精准路径;
  3. 多 Intent-Filter 独立生效:你代码中两个 <intent-filter> 是独立的,系统会分别匹配(即既响应自定义 Scheme,也响应 App Link 链接);
  4. category 必须包含 DEFAULTcategory.DEFAULT 是隐式 Intent 匹配的必要条件(系统会自动为隐式 Intent 添加该 category),缺少则无法匹配;
  5. BROWSABLE 作用:允许该 Activity 被浏览器或其他可浏览组件唤起(比如点击网页中的链接),缺少则无法通过网页跳转唤起。

四、底层逻辑:系统如何处理 Scheme 唤起

  1. 外部触发:浏览器/其他 App 调用 Intent(Intent.ACTION_VIEW, Uri.parse("tencent1112xxxxxxllk://"))Uri.parse("https://xxxx.qq.com/app")
  2. 系统解析:PackageManager 遍历所有 App 的 AndroidManifest.xml,解析其中的 <intent-filter>
  3. 匹配筛选:筛选出满足 actioncategorydata(scheme/host/path)匹配的 Activity;
  4. 结果处理
    • 无匹配:抛出 ActivityNotFoundException
    • 单个匹配:直接唤起该 Activity;
    • 多个匹配:弹出“选择打开方式”对话框(App Link 验证通过后可跳过此步);
  5. App Link 验证流程
    1
    配置 autoVerify="true" → 系统访问域名下的 assetlinks.json → 校验签名/包名 → 验证通过→直接唤起;验证失败→走普通匹配

五、关键注意事项

  1. 自定义 Scheme 建议加唯一标识(如你的包名/腾讯 App ID),避免与其他 App 冲突;
  2. App Link 需确保 assetlinks.json 可访问、格式正确(包含 App 包名、签名的 SHA256 指纹);
  3. 测试 App Link 需用正式签名包(debug 签名的验证逻辑不同);
  4. 若需传递参数,可在 Scheme 后追加 query,如 tencent1112xxxxxxllk://?id=123https://xxxx.qq.com/app?id=123,在 Activity 中通过 getIntent().getData().getQueryParameter("id") 获取。

总结:Scheme 本质是 App 向系统注册的“唤起协议”,自定义 Scheme 简单但安全性低,App Link 基于 HTTPS 更安全且体验更好,两者可结合使用(如自定义 Scheme 用于 App 间内部唤起,App Link 用于网页唤起)。