Android Deep links

Deep links是可以让用户直接进入应用的特定部分的URI。

  • 创建,在Manifest中的activity声明中添加intent过滤器
ini 复制代码
<activity
    android:name=".MyMapActivity"
    android:exported="true"
    ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="geo" />
    </intent-filter>
</activity>
  • 当存在多个能够处理相同scheme的应用时,app会打开一个对话框选择。

  • 被调用方使用:获取intent.data,拆分解析,组件封装,通过规则+Arouter跳转目标业务。

官方文档:developer.android.com/training/ap...

APP links:scheme为https,并且有签名等机制

  1. 准备域名和资产关联文件

    • 确保你拥有一个 HTTPS 域名,比如 www.example.com

    • 在该域名的服务器根目录下创建一个 .well-known/assetlinks.json 文件,内容类似:

      json 复制代码
      [
        {
          "relation": ["delegate_permission/common.handle_all_urls"],
          "target": {
            "namespace": "android_app",
            "package_name": "com.yourcompany.yourapp",
            "sha256_cert_fingerprints": [
              "AA:BB:CC:...:YY:ZZ"    // 你用来签名 APK 的证书指纹(SHA‑256)
            ]
          }
        }
      ]
    • 部署后,在浏览器访问 https://www.example.com/.well-known/assetlinks.json 能拿到该 JSON。

  2. 在 AndroidManifest.xml 中声明 Intent Filter

    在你希望处理 App Link 的 Activity 节点里添加:

    xml 复制代码
    <activity android:name=".YourDeepLinkActivity">
      <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    
        <!-- 匹配你的 HTTPS 链接 -->
        <data
          android:scheme="https"
          android:host="www.example.com"
          android:pathPrefix="/applink" />
      </intent-filter>
    </activity>
    • android:autoVerify="true":安装时系统自动向服务器验证 assetlinks.json
  3. 签名与构建

    • 用与你在 assetlinks.json 中声明的同一套发布签名(release keystore)对 APK 进行签名。
    • 安装到设备或模拟器上。
  4. 系统验证

    • 安装 APK 后,Android 框架会向 https://www.example.com/.well-known/assetlinks.json 发起请求,检查 package_name 与证书指纹是否匹配。
    • 验证成功后,这个 App 就被注册为该域名的"所有者",当用户点击符合规则的链接时会优先唤起你的 App。
  5. 测试你的 App Link

    • 命令行测试

      sql 复制代码
      adb shell am start \
        -a android.intent.action.VIEW \
        -c android.intent.category.BROWSABLE \
        -d "https://www.example.com/applink/page/123"
    • 检查验证状态

      arduino 复制代码
      adb shell pm get-app-links com.yourcompany.yourapp

      或(Android 11+)

      css 复制代码
      adb shell pm verify-app-links --re-verify com.yourcompany.yourapp

      查看输出中是否有 verified

  6. 在代码中处理跳转

    • YourDeepLinkActivityonCreate()/onNewIntent() 中,用 intent.data 拿到 Uri,再解析出 pathSegmentsqueryParameter

      kotlin 复制代码
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        intent.data?.let { uri ->
          val segments = uri.pathSegments   // e.g. ["applink","page","123"]
          val pageId = segments.getOrNull(2)
          // 根据 pageId 展示对应页面
        }
      }
      override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        intent.data?.let { handleDeepLink(it) }
      }
  7. 优雅回退

    • 如果 App 未安装,点击 HTTPS 链接会在浏览器打开对应网页。
    • 你也可以在网页中检测 UA 或 JS 判断,提示用户下载或跳转到应用市场。

总结

  1. 服务器端 :部署 assetlinks.json,声明包名+证书指纹。
  2. 客户端 :AndroidManifest 中配置 <intent-filter android:autoVerify="true">;用 release 签名构建并安装。
  3. 验证与测试:系统自动验证并响应点击,或用 ADB 命令手动测试。
  4. 业务处理 :在 Activity 中通过 intent.data 获取并解析 URL 参数。
相关推荐
golang学习记1 天前
从0死磕全栈之Next.js App Router动态路由详解:从入门到实战
前端
huangql5201 天前
基于前端+Node.js 的 Markdown 笔记 PDF 导出系统完整实战
前端·笔记·node.js
在逃的吗喽1 天前
Vue3新变化
前端·javascript·vue.js
yqwang_cn1 天前
打造优雅的用户体验:自定义jQuery工具提示插件开发全解析
前端·jquery·ux
小Tomkk1 天前
AI 提效:利用 AI 从前端 快速转型为UI/UX设计师和产品
前端·人工智能·ui
Demoncode_y1 天前
Vue3中基于路由的动态递归菜单组件实现
前端·javascript·vue.js·学习·递归·菜单组件
杨超越luckly1 天前
HTML应用指南:利用POST请求获取全国中国工商农业银行网点位置信息
大数据·前端·html·数据可视化·银行网点
皮蛋瘦肉粥_1211 天前
pink老师html5+css3day02
前端·css3·html5
qianmo20211 天前
基于pycharm实现html文件的快速实现问题讨论
前端·html
IT_陈寒1 天前
SpringBoot3踩坑实录:一个@Async注解让我多扛了5000QPS
前端·人工智能·后端