导读:本期聚焦于周翰文创作的《如何使共享链接直接在您的Android应用中打开而非浏览器》,敬请观看详情。把链接分享给别人,对方点开却跳进了浏览器网页,而不是直接进入应用,这是不少Android开发中让人头疼的问题。其实解决思路主要有两条:一是通过Manifest配置intent-filter实现Deep Links,拦截特定scheme的链接;二是验证度更高的App Links方案,借助assetlinks.json文件和域名校验,让普通http或https链接也能直接唤起应用。本文围绕这两种方式展开,讲解Manifest的写法、intent过滤规则、Android Studio的App Links Assistant工具用法、域名验证流程以及常见失效原因排查,帮你把分享出去的链接真正变成应用的入口。

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

如何使共享链接直接在您的Android应用中打开而非浏览器

方案一:使用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中配置了singleTasksingleTop,当应用已经在后台运行时再次点击链接,不会走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状态表示域名验证成功。如果显示nonelegacy_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

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260904/50061.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。