Android 深度链接(Deep Linking)实战指南:为 App 内容开启 Intent Filter 并支持 Google 搜索索引 文档教程移动开发【免费下载链接】android-training-course-in-chineseAndroid官方培训课程中文版项目地址https://gitcode.com/gh_mirrors/an/android-training-course-in-chinese点击查看免费下载在 Android 中深度链接Deep Link允许用户在浏览器、搜索结果或其它 App 中点击某个 URI直接打开你 App 内对应的内容页面。本文以 android-training-course-in-chinese 仓库中的「为App内容开启深度链接」课程ux/app-indexing/deep-linking.md为核心完整讲解如何在 Manifest 中声明 intent filter、如何从传入 Intent 中读取并解析数据、如何遵循导航与用户体验约定以及如何用 adb 命令验证深度链接能否正确路由到目标 Activity并结合本仓库中 Intent过滤、为索引指定App内容 等相关课程帮助你搭建一套可被搜索引擎抓取、可被用户直接点击进入的 App 内容索引体系。深度链接与 App 内容索引的关系在介绍具体实现前先明确深度链接在整个 App 索引App Indexing方案中的位置。随着移动 App 越来越普及用户不仅通过网站查找信息也会直接在自己安装的 App 中查找内容。通过为 Activity 提供 intent filter可以让 Google 搜索在你的 App 运行时为 App 与匹配 URI 的 Intent 建立路径从而把搜索结果直接导向 App 中的具体内容而不是网页。从本仓库的课程结构看整个「使得你的App内容可被Google搜索」ux/app-indexing/index.md包含两个步骤开启深度链接ux/app-indexing/deep-linking.md在 App 的 Manifest 中为相关 Activity 添加 intent filter使 URI 能够解析到指定 Activity。这是本文的核心主题。为索引指定 App 内容ux/app-indexing/enable-app-indexing.md通过网站 Sitemap 或页面head中的注解把android-app://格式的深度链接 URI 共享给 Google使 Googlebot 能为 App 内容建立索引。简而言之深度链接解决的是「URI 如何路由到 App 内页面」的问题而内容索引解决的是「Google 如何发现并展示这些深度链接」的问题。两者配合用户才能在移动端搜索结果中点击链接直接打开 App 内容。为深度链接添加 Intent Filter要使 Google 能够抓取你的 App 内容并允许用户从搜索结果进入 App必须在 App 的 Manifest 文件中为相关 Activity 添加 intent filter。这些 intent filter 能使深度链接与你的任意 Activity 相连。例如用户可以在购物 App 中点击一条深度链接直接浏览自己所搜索的产品详情页。Intent Filter 的三个核心组成部分一条面向深度链接的 intent filter需要包含以下元素和属性值action指定ACTION_VIEW操作对应字符串常量android.intent.action.VIEW。ACTION_VIEW是「查看某内容」的通用动作声明它使得 Google 搜索等外部调用方可以触达该 intent filter。这也符合隐式 Intent 的常规用法——在 Intent的发送 课程中查看网页、查看地图等场景使用的都是ACTION_VIEW配合 Uri 数据。data添加一个或多个data标签每一个标签代表 Activity 对一种 URI 格式的解析规则。data至少必须包含android:scheme属性URI 的方案名如http、https、或自定义的example。还可以添加额外属性来精确限定 Activity 所接受的 URI 类型例如android:hostURI 的主机名用于限定scheme://host部分android:path精确匹配路径android:pathPrefix匹配路径前缀android:pathPattern按正则模式匹配路径android:mimeType匹配 MIME 类型详见 Intent过滤。例如你可能有几个 Activity 可以接受相似的 URI仅仅是路径名不同。此时使用android:path或它的变体pathPattern、pathPrefix系统就能辨别对不同 URI 路径应该启动哪个 Activity。category必须包含BROWSABLEcategory对应android.intent.category.BROWSABLE。BROWSABLE对于使 intent filter 能被浏览器访问是必要的——没有这个 category在浏览器中点击链接将无法解析到你的 App。DEFAULTcategoryandroid.intent.category.DEFAULT是可选的但官方建议添加。没有它Activity 只能通过 App 组件名称以显式explicitIntent 方式启动。正如 Intent过滤 课程所强调的为了接受隐式 intent必须在 intent filter 中包含CATEGORY_DEFAULT因为startActivity()和startActivityForResult()会将所有 intent 视为已声明CATEGORY_DEFAULT未声明该 category 的 Activity 无法响应隐式 Intent。完整的 Manifest 配置示例下面这段 XML 展示如何在 Manifest 中为深度链接指定 intent filter。示例中URIexample://gizmos和http://www.example.com/gizmos都能解析到同一个 Activityactivity android:namecom.example.android.GizmosActivity android:labelstring/title_gizmos intent-filter android:labelstring/filter_title_viewgizmos action android:nameandroid.intent.action.VIEW / category android:nameandroid.intent.category.DEFAULT / category android:nameandroid.intent.category.BROWSABLE / !-- 接受以example://gizmos开头的 URIs -- data android:schemeexample android:hostgizmos / !-- 接受以http://www.example.com/gizmos开头的 URIs -- data android:schemehttp android:hostwww.example.com android:pathPrefixgizmos / /intent-filter /activity值得注意的关键点第一条data使用自定义 schemeexample和 hostgizmos精确匹配example://gizmos这类 URI第二条data使用标准的httpscheme 和www.example.com主机配合android:pathPrefixgizmos匹配http://www.example.com/gizmos开头的 URL——这通常对应你的网站 URL从而实现「网页与 App 内容一一对应」android:label可以为 intent filter 设置一个可读名称便于用户在解析对话框Chooser中识别。Note对一个 URI patternintent filter 只能包含一个单一的data元素如果需要匹配额外的 URI pattern应创建不同的 intent filter。这一点在 Intent过滤 中也有印证——当 Activity 需要同时处理文本与图片、或同时响应ACTION_SEND与ACTION_SENDTO时必须拆分成多个独立的 intent filter避免 action 与 data 组合互相矛盾。当你把包含指定 Activity 内容 URI 的 intent filter 添加到 App Manifest 后Android 就可以在 App 运行时为 App 与匹配 URI 的 Intent 建立路径。与显式/隐式 Intent 的对照从本仓库 Intent过滤 与 Intent的发送 两课可以更完整地理解这一机制显式 Intent 直接指定要启动的组件类名用于同 App 内 Activity 切换隐式 Intent 只声明动作如ACTION_VIEW与数据Uri 或 MIME type由系统根据已安装 App 的 intent filter 解析出可响应的 Activity当 App 被安装到设备上时系统会识别 Manifest 中的 intent filter 并记录下来当其它 App 执行startActivity()时系统自动查找可以响应该 intent 的 Activity。深度链接正是「隐式 Intent intent filter」模式的典型应用浏览器或搜索引擎发出一个ACTION_VIEW的隐式 Intent携带example://gizmos这样的 Uri系统依据你声明的 intent filter 把请求路由到对应 Activity。从传入的 Intent 读取数据一旦系统通过 intent filter 启动了你的 Activity你就可以使用 Intent 提供的数据来决定需要处理什么内容。读取 Action 与 Data调用getData()和getAction()方法可以取出传入 Intent 中的数据与操作Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent getIntent(); String action intent.getAction(); Uri data intent.getData(); }技术要点你可以在 Activity 生命周期的任何时候调用这些方法但一般应该在前期回调中调用例如onCreate()或onStart()以便尽早拿到深度链接的目标内容并完成界面加载getIntent()返回启动该 Activity 的 Intent参照 Intent过滤 中的同样用法拿到Uri data后可进一步调用data.getScheme()、data.getHost()、data.getPath()等方法来解析 URI 的各个组成部分从而判断应该展示哪条内容除onCreate/onStart外若 Activity 以singleTop等启动模式被复用例如再次收到相同深度链接还应处理onNewIntent()回调并通过setIntent()更新当前 Intent确保 UI 跟随新链接刷新。根据 Action 分支处理如果同一个 Activity 的 intent filter 声明了多个动作可以在读取 Intent 后根据 action 值分支处理。参考 Intent过滤 中的示例思路可以基于intent.getType()或解析出的 Uri 来决定处理逻辑Intent intent getIntent(); String action intent.getAction(); Uri data intent.getData(); if (Intent.ACTION_VIEW.equals(action) data ! null) { // 根据 data 的 scheme/host/path 解析并展示对应内容 }深度链接的用户体验约定仅仅「能打开」还不够深度链接的用户体验直接决定用户是否愿意长期使用该入口。原文档给出了两条必须遵守的惯例惯例一直接打开内容不设任何障碍深度链接应直接为用户打开内容不需要任何提示、插播式广告页和登录页面。要确保用户能看到 App 的内容即使之前从没打开过这个应用——这意味着你不能假设用户已经登录深度链接指向的页面必须是可匿名访问的。当用户从启动器Launcher正常打开 App 时可以在操作结束后再给出登录等提示。这条准则与网站的 first click free首次点击免费体验一脉相承。惯例二遵循 Back 与 Up 的导航设计遵循 提供向上导航与历史导航 中的设计指导使 App 能够满足用户通过深度链接进入后向后导航的需求。从仓库中 提供向上的导航 课程可以得到具体的实现方案用户通过深度链接从外部如浏览器、搜索结果的其它 App进入你的 Activity 时该 Activity 可能不属于你 App 的默认任务此时若用户点击 ActionBar 的 Up 按钮不能简单调用NavUtils.navigateUpFromSameTask()该方法仅适用于「当前任务由你的 App 发起」的情况而应先调用NavUtils.shouldUpRecreateTask()检查当前 Activity 实例是否在另一个 App 的任务中如果返回true应使用TaskStackBuilder创建一个带合成返回栈synthesized back stack的新任务通过addNextIntentWithParentStack()把该 Activity 的所有父 Activity 加入返回栈再调用startActivities()完成向上导航为支撑这一机制必须在 Manifest 中为每个子 Activity 声明逻辑父 ActivityAndroid 4.1API 16起使用android:parentActivityName属性4.0 及以下版本则配合android.support.PARENT_ACTIVITY的meta-data元素见 ux/implement-nav/ancestral.md。同样地启动Activity时保留导航 中介绍的TaskStackBuilder.addParentStack()/addNextIntent()构建返回栈的思路也可迁移到深度链接场景保证用户从链接进入后能按 Back 逐级返回而非直接退出 App。测试你的深度链接配置完成后必须验证 intent filter 的 URI 是否能正确解析到对应的 App Activity。官方推荐使用 Android Debug Bridgeadb的 activity manageram工具在设备或模拟器上直接发起路由测试。通用测试语法测试 intent filter URI 的一般 adb 语法是$ adb shell am start -W -a android.intent.action.VIEW -d URI PACKAGE参数含义-W等待启动完成便于确认是否成功解析-a android.intent.action.VIEW指定动作与 Manifest 中 intent filter 的ACTION_VIEW对应-d URI指定要测试的深度链接 URIPACKAGE目标 App 的包名。测试示例例如下面的命令试图浏览与指定 URI 相关的目标 App Activity$ adb shell am start -W -a android.intent.action.VIEW -d example://gizmos com.example.android针对上一节的 Manifest 示例该命令中的 URIexample://gizmos会匹配schemeexample、hostgizmos的data声明从而启动com.example.android.GizmosActivity。测试建议分别测试你声明的每一种 URI 形态自定义 scheme、http/httpsscheme、不同路径前缀确保path/pathPrefix/pathPattern的匹配范围符合预期观察系统输出中是否存在Warning: Activity not started之类的提示若出现通常意味着没有 Activity 能解析该 URI可能是 Manifest 中 scheme/host 写错或缺少BROWSABLE/DEFAULTcategory结合「解析对话框」场景验证若多个 App 声明了相同的 URI pattern系统会弹出选择界面这也是深度链接的常见预期行为参照 Intent的发送 中多 App 可处理同一 Intent 时的描述。让 Google 为 App 内容建立索引深度链接打通后要让搜索结果直接展示 App 内容还需把「网页与 App 内容的对应关系」共享给 Google。这一步在原文档的姊妹课程 为索引指定App内容 中有完整说明这里提炼其核心帮助你理解深度链接的完整闭环。android-app:// 深度链接 URI 格式共享给 Google 搜索的深度链接必须遵循如下 URI 格式android-app://package_name/scheme/host_path各部分含义package_name你的 APK 在 Google Play Developer Console 中列出的包名scheme匹配你 intent filter 的 URI 方案即data中的android:schemehost_path指向 App 内指定内容的部分对应data中的android:host及路径。两种注解方式方式一Sitemap 注解在 Sitemap 文件中使用xhtml:link标签指定用作替代 URI 的深度链接?xml version1.0 encodingUTF-8 ? urlset xmlnshttp://www.sitemaps.org/schemas/sitemap/0.9 xmlns:xhtmlhttp://www.w3.org/1999/xhtml url locexample://gizmos/loc xhtml:link relalternate hrefandroid-app://com.example.android/example/gizmos / /url ... /urlset方式二网页head注解在 HTML 页面的head标签内为每一个页面添加一个link标签html head link relalternate hrefandroid-app://com.example.android/example/gizmos / ... /head body ... /body用 robots.txt 控制抓取当 Googlebot 为你的 App 内容建立索引后你的 App 可能会收到来自 Googlebot 的 HTTP 请求。因此必须正确配置服务器上的robots.txt允许这些请求。例如允许 Googlebot 访问/api/目录、限制访问其它目录User-Agent: Googlebot Allow: /api/ Disallow: /至此从「Manifest 声明 intent filter」→「App 内读取并渲染内容」→「Sitemap/网页注解 robots.txt 放行」→「adb 验证路由」一条完整的深度链接与 App 内容索引链路就全部打通了。小结在 android-training-course-in-chinese 课程体系中为 App 开启深度链接是「使得你的 App 内容可被 Google 搜索」ux/app-indexing/index.md的第一步核心要点可以归纳为声明意图在 Manifest 中为相关 Activity 添加包含ACTION_VIEW、BROWSABLE并建议加入DEFAULT的 intent filter用data声明 scheme、host 及 path 匹配规则读取数据在onCreate()/onStart()中通过getIntent().getAction()与getIntent().getData()解析深度链接并据此展示对应内容遵循体验深度链接直达内容、不设登录/广告拦截配合android:parentActivityName与TaskStackBuilder实现符合规范的 Up/Back 导航验证路由使用adb shell am start -W -a android.intent.action.VIEW -d URI PACKAGE在设备或模拟器上验证 URI 是否解析到正确 Activity接入索引按android-app://package_name/scheme/host_path格式通过 Sitemap 或页面head注解共享深度链接并配置robots.txt允许 Googlebot 抓取。完成以上步骤后你的 App 内容就可以被搜索引擎抓取用户也能从搜索结果中直接点击进入 App 内的具体页面——这正是移动时代「内容可被发现」的关键能力。赞分享文档教程移动开发【免费下载链接】android-training-course-in-chineseAndroid官方培训课程中文版项目地址https://gitcode.com/gh_mirrors/an/android-training-course-in-chinese点击查看免费下载相关推荐为 Google 搜索索引指定 Android App 内容App Indexing 深度链接接入指南Android 官方培训课程中文版为 Google 搜索索引指定 Android App 内容App Indexing 深度链接接入指南Android 官方培训课程中文版 本文基于开源仓库文档教程移动开发Android官方培训课程中文版使你的App内容可被Google搜索——深度链接与App内容索引实战指南Android官方培训课程中文版使你的App内容可被Google搜索——深度链接与App内容索引实战指南 随着移动应用愈发普及用户不再只从网站上查找信息也文档教程移动开发highlight.io 会话搜索深链接Session Search Deep Linking实战指南highlight.io 会话搜索深链接Session Search Deep Linking实战指南 在 highlight.io 中你在会话Sess可观测性后端上一篇DeepSeek-Coder-V2 本地部署完全指南16GB显卡跑通首次推理下一篇如何一键检测微信单向好友三步告别无效社交的智能方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考