DeepLink

本文详细介绍如何使用DeepLink技术通过网页链接直接打开APP内的特定界面,并解释如何传递参数以实现灵活跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#
DeepLink(APPLink)技术------通过网页打开APP任意Activity

  由于工作要求, 非要搞什么深度链接, 在百度的帮助下花了半小时搞明白了DeepLink是什么, 怎么用, 能做什么.

  那么, DeepLink是什么呢? 其实说白了, 就是可以通过一个网页链接来打开APP中某一界面的技术, 没错, 就是通过链接来打开APP. 那么要怎么做呢? 首先要在想要被打开的activity的清单文件中注册一个意图过滤器:
Manifast
  如上图所示,其中action 和两个 category 是固定不变必须要加的, 特别是 BROWSABLE这个 category, 不加入这个就不能再浏览器中打开APP.

<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>

  然后就是data节点了, 上图的data节点对应demo://www.open.com:8080这个链接, 这个data就是用来匹配具体应用的, data节点中还可以加入path属性, 如果加了该属性(例如:android:path="\aaa")要匹配到APP就需要在链接的端口号后边加\aaa, 需要注意的是, 清单文件 data节点path属性必须要以\开头. 当然host port path属性都可以不加, 仅仅有scheme也是可以匹配到应用的, 当然, 你需要保证自己的scheme是手机APP中唯一的.

  还有一个地方需要注意, 就是如果把链接 demo://www.open.com:8080直接复制到浏览器中, 你会发现其实并不能打开APP, 这是因为浏览器检测到你的链接不是以http开头所以自动识别进行搜索, 所以需要写一个简单的html页面来进行测试:
比如这个:

<html>
  <head>
    <meta charset="UTF-8">
    <title>Test</title>
    <link href="/style.css" rel="stylesheet" type="text/css" media="all">
  </head>
  <body>
<a href="demo://www.open.com:8080/open?activity=com.eshel.chat.deeplink.LoginActivity">open</a>
  </body>
</html>

复制上述html代码, 新建文本文件, 粘贴并修改链接后改后缀为**.html**, 之后选择打开方式为浏览器, 点击open按钮就可以测试了.

  如果上述步骤都执行完, 那么应该可以通过DeepLink打开 APP了, 但是又有一个问题来了, 怎么才能打开app中任意界面呢? 难道每个activity都要加意图过滤器, 然后先不管这个问题, 我在想假如链接后边有参数, 那么会传到被打开的activity中呢?

  这个是我测试用的链接:demo://www.open.com:8080/open?activity=com.eshel.chat.deeplink.LoginActivity, 下边截图是测试结果:

![Intent](https://img-blog.csdnimg.cn/img_convert/c376d9fd3de8bd7a14981c735be79445.png)

点击链接后我在 MainActivity中 `getIntent().tostring` 设置到textview上, 可以看出其中dat部分就是我的链接, 那么dat是什么呢? 既然结果是通过toString方法得到的, 那么先看下intent的toString方法: ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/fc80078b031096a58d64b2adbbbbd872.png)
可以看出, toString的实现其实都是在toShortString里. 那么再来看下toShortString: ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/a0d2aeb2e87a0b531e0f0c15266e01e4.png)
终于看到dat中的url是mData toString得到的, mData是什么呢? 再来看一个方法: ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/083edb8b5008db6f6e2a0bf80beafeed.png)
通过getData方法可以看出mData是个Uri, 那么这个mData应该就是对应的是清单文件中的data节点了, 通过代码提示和文档注释可以找到Uri中有方法来获取'?'后边的参数, 代码如下:
		setContentView(R.layout.activity_main);
		mTest = findViewById(R.id.test);
		Intent intent = getIntent();
		if(intent != null){
			mTest.setText(intent.toString());
			try {//com.eshel.chat.deeplink.LoginActivity
				String parameter = intent.getData().getQueryParameter("activity");
				Class<?> aClass = Class.forName(parameter);
				if(aClass != null){
					Intent intent1 = new Intent(this,aClass);
					startActivity(intent1);
					finish();
				}
//				mTest.setText(path);
			}catch (Exception e){
			    e.printStackTrace();
			}catch (Error e){
			    e.printStackTrace();
			}
		}

获取到URL中的参数, activity的值, 并通过反射尝试找到那个类, 如果存在则跳转, 当然千万不要忘记try catch. 通过这种方法就可以在URL中指定任意存在的activity并进行跳转了.

  现在又有一个问题了, 虽然已经可以打开任意activity了, 但有的 activity 是依赖一些参数的, 它们在创建的时候 通常会通过 getIntent().getStringExtra("aaa")等方法从上个activity获取一些数据, 那么从链接跳转到该activity并没有携带extra的数据, 怎么办呢? 很简单, 在参数后拼接一个参数extra, 最好是一个json数组, 然后在代码中获取到该数据, 转换json格式并遍历, 通过循环进行putExtra到intent中, 这样就可以在把参数传递到actvity中了, 当然如果需要传递一个对象的话我就帮不了你了, 这种方式只能传递基本数据类型, 如果要传递javabean对象可以自己定义格式写代码解析json, 并通过反射或者gson框架将json转成javabean对象, 具体怎么搞这里就不再说了, 感兴趣的可以自己操作试试.

### HarmonyOS 中 Deep Link 的实现方式 在 HarmonyOS 中,Deep Link 是一种通过统一资源标识符(URI)直接跳转到应用特定页面的能力。这种机制常用于从外部(如网页、其他应用)打开应用内的某个指定 Ability 页面,提升用户体验并支持营销推广等场景[^1]。 #### 1. 定义 Deep Link URI 模式 开发者需要在应用的配置文件 `config.json` 中为目标 Page Ability 配置 URI 路由规则。该规则定义了哪些 URI 可以触发该 Ability 的启动,并允许系统识别和路由请求。 ```json { "module": { "abilities": [ { "name": ".SecondAbility", "uri": { "scheme": "example", "host": "deeplink", "paths": ["/page1", "/page2"] } } ] } } ``` 上述配置表示当用户点击类似 `example://deeplink/page1` 的链接时,系统将启动 `SecondAbility` 页面[^1]。 #### 2. 处理 Deep Link 请求 当应用被 Deep Link 启动时,目标 Ability 会接收到一个包含 URI 数据的 Intent。开发者可以通过 `getIntent()` 方法获取该 Intent,并解析其中的 URI 参数以决定展示的内容或执行的操作。 ```java @Override public void onStart(Intent intent) { super.onStart(intent); String uri = intent.getUri(); if (uri != null && uri.startsWith("example://")) { // 解析 URI 并跳转至对应内容 if (uri.contains("/page1")) { // 显示 page1 内容 } else if (uri.contains("/page2")) { // 显示 page2 内容 } } } ``` 此方法确保应用可以根据传入的 URI 动态加载相应的界面或数据[^1]。 #### 3. 测试 Deep Link 行为 开发者可以使用 ADB 命令测试 Deep Link 是否正常工作: ```bash bm start-app -n "com.example.myapplication/.SecondAbility" --uri "example://deeplink/page1" ``` 该命令模拟了从外部调用 Deep Link 的行为,验证是否能够正确启动目标 Ability 并处理 URI 数据[^1]。 #### 4. 权限与安全性考虑 为了防止恶意调用,建议在配置 Deep Link 时限制访问权限。例如,在 `config.json` 中设置 `exported: true` 仅适用于需要公开访问的 Ability: ```json { "module": { "abilities": [ { "name": ".SecondAbility", "exported": true, "uri": { "scheme": "example", "host": "deeplink", "paths": ["/page1"] } } ] } } ``` 此外,应避免暴露敏感操作或数据给外部调用,确保 URI 参数经过验证和过滤,防止注入攻击或其他安全风险[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值