在Android开发中,我们经常遇到这样的需求:用户把一个商品页、一篇文章或者一个活动页面的链接分享到微信、短信或者其他渠道,接收方点击链接后,理想的体验是直接唤起我们的应用并定位到对应页面,而不是打开浏览器显示一个网页版。要实现这个效果,核心就是Android系统提供的链接分发机制,包括Deep Links和Android App Links两种方案。这两种方案在实现方式、安全性和用户体验上有明显差异,下面我们逐一分析。

方案一:使用Deep Links拦截自定义scheme
Deep Links是最基础的实现方式,原理是在AndroidManifest.xml中为目标Activity声明<intent-filter>,并指定一个自定义的URI scheme。当系统中任何应用发起包含该scheme的Intent时,系统就会弹出应用选择框或者直接打开声明了该scheme的应用。
典型的配置如下:
<activity android:name=".ProductActivity" 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="myapp" android:host="product" />
</intent-filter>
</activity>配置中有几个关键点需要注意。首先,android:exported必须为true,否则其他应用无法唤起该Activity;其次,category必须同时包含DEFAULT和BROWSABLE,缺了BROWSABLE浏览器就不会把链接分发给应用;最后,data标签里的scheme、host、path共同决定了能匹配哪些链接,比如上面的配置可以匹配myapp://product/123这样的地址。
Deep Links的优点是实现简单,不需要服务端配合,也不用域名验证,几分钟就能跑通。但它有两个明显的缺陷:一是链接不是标准的http形式,在只支持网页链接的渠道里没法直接点击;二是安全性弱,任何恶意应用都可以声明相同的scheme来劫持链接,用户点开后可能进入伪造页面。此外,如果有多个应用声明了同一个scheme,系统会弹出选择框让用户挑选,体验会打折扣。
方案二:使用Android App Links验证域名归属
App Links是Google在Android 6.0(API 23)之后推出的增强方案,它允许应用直接声明自己拥有某个https域名,通过域名验证后,普通的https链接就能直接打开应用,不弹选择框,也不容易被劫持。
第一步仍然是在Manifest中声明intent-filter,但scheme必须固定为https,并且要加上autoVerify属性:
<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" />
<data android:scheme="https" android:host="www.ippipp.com" android:pathPrefix="/product" />
</intent-filter>autoVerify是整个方案的灵魂。声明了这个属性后,系统会在应用安装或更新时自动访问https://yourdomain/.well-known/assetlinks.json这个地址,检查域名是否真的授权给了这个应用。
第二步是配置assetlinks.json文件。这个文件需要放置在网站根目录的.well-known目录下,内容包含应用的包名和签名证书的SHA256指纹:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.myapp",
"sha256_cert_fingerprints": ["AA:BB:CC:DD:EE:FF:11:22:33:44:55:66:77:88:99:00:AA:BB:CC:DD:EE:FF:11:22:33:44:55:66:77:88:99:00"]
}
}]获取签名指纹可以用命令行工具:keytool -list -v -keystore my-release-key.keystore,输出的SHA256字段填入上面的fingerprints数组即可。需要特别提醒的是,调试版本和发布版本的签名不一样,如果用调试包测试,assetlinks.json里必须写调试签名的指纹,否则验证不会通过。另外,服务器端要求该文件以application/json类型返回,且不允许重定向,跨域访问时要加上正确的响应头。
相比Deep Links,App Links的最大优势是安全性:域名验证机制保证了只有真正拥有该域名的应用才能接管链接,恶意应用无法伪造。同时,由于链接本身就是标准的https地址,分享到任何平台都可以正常展示和点击。缺点是配置相对繁琐,需要开发和运维配合,且只在Android 6.0以上生效。
在Activity中解析链接参数并跳转页面
无论采用哪种方案,链接最终都会通过Intent分发给目标Activity,接下来要做的是从Intent中取出路径参数,路由到正确的页面。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product);
Uri data = getIntent().getData();
if (data != null) {
// 获取host和路径,例如 https://www.ippipp.com/product/123
String host = data.getHost();
List<String> pathSegments = data.getPathSegments();
if (pathSegments.size() >= 2 && "product".equals(pathSegments.get(0))) {
String productId = pathSegments.get(1);
openProductDetail(productId);
}
}
}有一个容易被忽视的坑:Activity的启动模式。如果Activity在manifest中配置了singleTask或singleTop,当应用已经在后台运行时再次点击链接,不会走onCreate,而是回调onNewIntent方法。因此解析逻辑要同时覆盖这两个入口,否则用户在应用已打开的情况下点链接会没有反应。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
handleDeepLink(intent.getData());
}对于参数复杂的场景,建议自己封装一层路由表,把URI模式和目标页面的映射关系集中管理,避免随着页面增多,intent-filter越写越多导致维护困难。当然,也可以直接引入成熟的路由框架来处理这部分逻辑。
验证与常见问题排查
配置完成后,可以用adb命令快速验证Deep Links是否生效:
adb shell am start -a android.intent.action.VIEW \ -d "https://www.ippipp.com/product/123" com.example.myapp
如果命令执行后应用正常打开并定位到商品页,说明Intent过滤这部分没问题。对于App Links的域名验证状态,可以执行以下命令查看:
adb shell pm get-app-links com.example.myapp
输出中的verified状态表示域名验证成功。如果显示none或legacy_failure,需要依次检查:assetlinks.json是否可以公开访问、指纹是否与当前安装包签名一致、服务器返回的Content-Type是否正确。
还有几个高频问题值得留意。第一,国内部分定制ROM对App Links的支持不完整,即使验证通过也可能被系统拦截,可以引导用户在设置里手动允许该应用打开支持的链接。第二,从微信等应用内打开链接时,这些应用往往使用自带的WebView,链接分发机制可能被绕过,需要配合应用宝等渠道的scheme唤醒方案或者提示用户使用外部浏览器打开。第三,系统对域名验证有缓存,修改assetlinks.json后可能需要卸载重装应用才能触发重新验证,不要以为配置没生效就是写错了。
总结一下,追求快速上线、链接只在自家生态内流转,用Deep Links就够了;如果链接要公开分享、注重安全和体验,务必走App Links的完整验证流程。两者也可以并存,用https链接做主入口,自定义scheme做降级方案,覆盖尽可能多的设备和场景。
Deep LinksAndroid intent-filterApp Links修改时间:2026-09-04 06:10:37