当前位置: 首页 > news >正文

Andorid url链接跳转到APP中的指定界面

这种能力在 Android 中叫做Deep Link(深度链接 / 深层链接)或者App Links(应用链接)。核心原理是:将一个 HTTP/HTTPS 网址与你的 App 进行关联,当用户点击该链接时,系统会询问是否打开你的 App,并直接跳转至指定页面。

下面是完整的实现步骤,分为配置阶段接收阶段

一、核心配置(Manifest 配置)

<activity android:name=".MainActivity" android:exported="true"> <!-- Android 12+ 必须为 true --> <!-- 主入口 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- Deep Link 入口配置 --> <intent-filter android:autoVerify="true"> <!-- 必须指定 Action 和 Category --> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 核心配置:定义关联的网址 --> <!-- scheme: 协议 (http/https 或自定义) --> <!-- host: 域名 (例如: www.example.com) --> <!-- pathPrefix: 路径匹配 (例如: /user/detail) --> <data android:scheme="https" android:host="com.example.myapp" android:pathPrefix="/page" /> <!-- 也可以配置多个 data 标签支持不同链接 --> <!-- <data android:scheme="https" android:host="www.xxx.com" /> --> </intent-filter> </activity>

关键参数说明:

  • android:scheme:协议。必须设置,httphttps最通用。
  • android:host:域名。自定义链接也可以写(如myapp://...),但https更利于 SEO 和直接跳转。
  • android:pathPrefix:路径匹配。只有符合这个路径的链接才会触发。
  • android:autoVerify="true":自动验证(Android 6.0+)。告诉系统去校验你的域名,默认直接打开 App 而不弹出选择框。

二、服务器端配置(关键!AssetLinks.json)

如果你使用的是https链接(推荐),为了实现“直接跳转,不弹出选择框”,你必须在服务器上配置一个assetlinks.json文件。

  1. 生成文件:运行命令生成指纹(替换为你的包名):

    bash

    运行

    adb shell dumpsys package d | grep -A 2 your.package.name

    或者在 Android Studio 中查看:Run > App Links Assistant

  2. 文件内容格式

    json

    [ { "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "com.example.myapp", // 你的App包名 "sha256_cert_fingerprints": ["你的SHA-256指纹"] } } ]
  3. 上传位置:将此文件上传到你的服务器根目录:https://www.yourdomain.com/.well-known/assetlinks.json

    测试地址:https://digitalassetlinks.googleapis.com/v1/statements/list?key=YOUR_API_KEY&package_name=com.example.myapp

三、App 内部接收与跳转

当用户点击链接打开 App 时,数据会通过Intent传递给目标 Activity。你需要在onCreateonNewIntent中解析数据。

Kotlin 示例

kotlin

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 处理初始启动的 Intent handleIntent(intent) } // 如果Activity是singleTask模式,需要重写此方法 override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { // 1. 获取数据 val data: Uri? = intent.data if (data != null) { // 示例 URL: https://com.example.myapp/page/user/123?name=test val pathSegments = data.pathSegments // 获取路径段 [page, user, 123] val param = data.getQueryParameter("name") // 获取参数 test // 2. 根据路径跳转不同页面 if (pathSegments.size >= 2 && pathSegments[0] == "page") { when (pathSegments[1]) { "user" -> { val userId = pathSegments.getOrNull(2) // 跳转到用户详情页 startActivity(Intent(this, UserDetailActivity::class.java).apply { putExtra("USER_ID", userId) }) } "settings" -> { // 跳转到设置页 startActivity(Intent(this, SettingsActivity::class.java)) } } } } } }

java实例:

import android.content.Intent; import android.net.Uri; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 处理启动进来的链接 handleIntent(getIntent()); } // 当 Activity 以 singleTask 模式启动时,会走这里 @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleIntent(intent); } /** * 解析链接并跳转页面 */ private void handleIntent(Intent intent) { Uri data = intent.getData(); // 如果是从链接打开的,data 不为 null if (data != null) { // 示例链接:https://com.example.myapp/page/user/123?name=ZhangSan // 获取路径片段:/page/user/123 → [page, user, 123] List<String> pathSegments = data.getPathSegments(); // 获取参数:name → ZhangSan String name = data.getQueryParameter("name"); // 根据路径判断跳转到哪个页面 if (pathSegments.size() >= 2 && "page".equals(pathSegments.get(0))) { String targetPage = pathSegments.get(1); switch (targetPage) { case "user": // 用户详情页 String userId = pathSegments.size() >= 3 ? pathSegments.get(2) : ""; Intent userIntent = new Intent(this, UserDetailActivity.class); userIntent.putExtra("USER_ID", userId); startActivity(userIntent); break; case "settings": // 设置页 Intent settingsIntent = new Intent(this, SettingsActivity.class); startActivity(settingsIntent); break; } } } } }
http://www.jsqmd.com/news/647308/

相关文章:

  • 从LAMMPS到GROMACS:新手如何选择你的第一个分子动力学软件(附安装配置避坑指南)
  • 谷歌DeepMind设立首个AI哲学家岗位,解决AGI伦理困境
  • Navicat 数据管理
  • 告别命令行:用ChatboxAI给本地DeepSeek模型做个漂亮GUI(Ollama篇)
  • 2026年4月全球AI营销公司推荐:十家口碑产品评测对比知名领先 - 品牌推荐
  • CTFHub Modbus协议流量分析实战:从功能码到Flag提取
  • 线性插值与Sinc插值的数学原理及实战
  • RuoYi-Plus(前后端分离)视频上传实战:从Vue3组件到SpringBoot后端的完整实现
  • STM32F4串口烧录实战:FlyMCU高效配置指南
  • 从一道CTF题看Python原型链污染:手把手教你用Flask靶场复现DSACTF EzFlask漏洞
  • LeetCode刷题 day10
  • ONNX模型转换实战:从PyTorch到TensorRT的完整优化指南
  • Ubuntu 20.04离线环境下的NFS服务部署与配置指南
  • OpenHarmony-L2开发全流程实战指南:从源码到应用部署
  • Git冷命令拯救崩溃现场:从灾难到重生的终极指南
  • 【生成式AI架构设计黄金法则】:20年架构师亲授5大避坑指南与3套可落地的高可用方案
  • ESP8266+Tasmota智能电表DIY:从硬件选型到Home Assistant接入全流程(附避坑指南)
  • 用Matlab搞定偏微分方程数值解:从Poisson方程五点差分到Gauss-Seidel迭代的保姆级实战
  • OpenCV形态学处理实战:用C++手搓腐蚀膨胀算法,对比库函数效果
  • 智能问数大模型调用的4种部署方式
  • 国民技术 N32WB031KEQ6-2 QFN-32 蓝牙模块
  • 招生数据看不明白?大数据分析让智慧招生平台帮你理清思路
  • 网吧 / 营业厅实名核验更严了,帮你合规
  • 3分钟搞定PDF找茬:diff-pdf视觉对比神器完全指南
  • 基于COMSOL的BIC本征态计算通用算法:直观出图,适用于多种场景,附论文研究链接
  • XXL-JOB调度中心集群部署实战:从编译到反向代理全流程解析
  • 如何快速掌握ESP-CSI技术:无线感知的完整入门指南
  • 【生死心法】别用 assert() 谋杀物理世界!撕碎软件异常的“停机幻觉”,论“失效安全”与硬件级绝对熔断
  • Cursor+Apifox MCP Server:智能接口自动化测试的实践与突破
  • ThreeJS实战:如何优雅地给3D模型添加点击弹窗(附完整代码)