0

0

Android WebView应用深度链接:实现特定URL在应用内打开而非浏览器

DDD

DDD

发布时间:2025-12-03 15:35:17

|

550人浏览过

|

来源于php中文网

原创

android webview应用深度链接:实现特定url在应用内打开而非浏览器

本教程详细阐述如何在基于WebView的Android应用中,通过配置AndroidManifest.xml的intent-filter,实现对特定URL的深度链接。用户点击包含应用域名的链接时,系统将直接启动应用并加载该URL,而非默认的Web浏览器,从而提升用户体验并确保内容在应用环境中呈现。

在Android开发中,许多应用程序选择使用WebView来承载其Web内容,这使得混合应用开发变得高效。然而,一个常见的需求是确保当用户点击一个与应用关联的特定URL(例如,通过消息应用分享的链接)时,该链接能够直接在原生Android应用中打开,而不是启动外部Web浏览器。这种机制被称为深度链接(Deep Linking)或应用链接(App Links)。

核心解决方案:配置 AndroidManifest.xml 实现深度链接

实现这一功能的关键在于在您的AndroidManifest.xml文件中正确声明一个intent-filter。这个过滤器会告知Android操作系统,您的应用程序能够处理特定模式的Web URL。

1. 修改 AndroidManifest.xml

在您希望处理这些URL的Activity的标签内部,添加以下intent-filter配置:

<activity android:name=".YourMainActivity"
          android:exported="true"> <!-- Android 12 (API 31) 及更高版本需要明确声明 exported 属性 -->
    <!-- 现有 MAIN 和 LAUNCHER 过滤器,用于应用图标启动 -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <!-- 新增的深度链接过滤器 -->
    <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="https"
            android:host="tcg-wallet.ga" />
        <!-- 如果需要同时支持 HTTP,可以再添加一个 data 标签 -->
        <!-- <data
            android:scheme="http"
            android:host="tcg-wallet.ga" /> -->
        <!-- 如果需要匹配特定路径,可以使用 pathPrefix, path 或 pathPattern -->
        <!-- <data
            android:scheme="https"
            android:host="tcg-wallet.ga"
            android:pathPrefix="/home" /> -->
    </intent-filter>
</activity>

标签解释:

  • android:name="android.intent.action.VIEW": 声明此intent-filter用于响应用户尝试“查看”数据(通常是URL)的意图。
  • android:name="android.intent.category.DEFAULT": 允许此Activity接收不带特定类别的隐式Intent。这是响应通用Web链接所必需的。
  • android:name="android.intent.category.BROWSABLE": 允许Activity安全地被Web浏览器调用,以处理链接。没有此类别,浏览器将无法启动您的应用。
  • data 标签: 这是定义应用可以处理的URL模式的核心。
    • android:scheme: 指定URL的协议(例如 https 或 http)。
    • android:host: 指定URL的主机名(例如 tcg-wallet.ga)。
    • 您还可以使用 android:pathPrefix、android:path 或 android:pathPattern 来匹配更具体的URL路径,从而实现更精细的控制。
  • android:exported="true": 从Android 12 (API 31) 开始,如果您的Activity包含intent-filter且需要被外部组件(如系统或第三方应用)启动,必须明确设置此属性为true。

在Activity中处理传入的URL

一旦用户点击了符合上述intent-filter定义的URL,Android系统将启动或唤醒您的指定Activity。您需要在该Activity的onCreate()或onNewIntent()方法中获取并处理传入的URL数据。

蛙蛙写作——超级AI智能写作助手
蛙蛙写作——超级AI智能写作助手

蛙蛙写作辅助AI写文,帮助获取创意灵感,提供拆书、小说转剧本、视频生成等功能,是一款功能全面的AI智能写作工具。

下载

示例代码:

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.webkit.WebView;
import android.webkit.WebViewClient; // 导入 WebViewClient

public class YourMainActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 假设您的布局文件中有 WebView

        webView = findViewById(R.id.your_webview_id); // 替换为您的 WebView ID
        // 配置 WebView 设置,例如启用 JavaScript
        webView.getSettings().setJavaScriptEnabled(true);
        // 确保 WebView 在应用内加载链接,而不是打开外部浏览器
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        handleIntent(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent); // 更新当前Activity的Intent
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {
        String action = intent.getAction();
        Uri data = intent.getData();

        if (Intent.ACTION_VIEW.equals(action) && data != null) {
            // 获取完整的URL
            String fullUrl = data.toString();
            // 例如:https://tcg-wallet.ga/home?search=MP21-EN056&event=search
            // 您也可以通过 data.getQueryParameter("search") 获取特定参数

            // 将URL加载到 WebView
            if (webView != null) {
                webView.loadUrl(fullUrl);
            }
            // 或者根据解析出的参数执行其他应用逻辑
            // String searchParam = data.getQueryParameter("search");
            // if (searchParam != null) {
            //     // 执行搜索操作或跳转到应用内特定页面
            // }
        } else {
            // 处理常规启动逻辑,例如加载默认主页
            if (webView != null) {
                webView.loadUrl("https://tcg-wallet.ga/home"); // 您的默认主页
            }
        }
    }
}

说明:

  • getIntent().getData() 方法用于获取触发此Activity的URI。
  • onNewIntent() 方法用于处理当Activity已经在运行(例如,其启动模式为singleTop或singleTask)时,系统再次发送Intent的情况。
  • 获取到URL后,您可以选择直接将其加载到WebView中,或者解析URL中的查询参数(如search)来执行特定的应用内操作,从而实现更灵活的导航。
  • webView.setWebViewClient() 的设置是关键,它确保了在WebView内部点击的链接也会在WebView中加载,而不是再次启动外部浏览器。

从WebView分享链接的实现(上下文)

虽然上述深度链接配置解决了外部链接唤醒应用的问题,但原始问题中也涉及从WebView内部触发分享。这部分代码主要负责将WebView中的数据传递给Android原生分享接口,并不会直接影响深度链接的行为,而是为用户提供了分享链接的入口。

1. JavaScript 代码示例 (在 WebView 页面中):

在您的Web页面中,添加一个按钮和相应的JavaScript代码来调用Android原生分享接口。

const shareData = {
    title: '搜索价格',
    text: '搜索卡片通过: "' + document.getElementById('search').value + '"',
    url: document.URL // 当前页面的完整URL
};

const btn = document.getElementById('share-url');

if (typeof btn !== 'undefined' && btn !== null) { // 确保按钮存在
    btn.addEventListener('click', async () => {
        try {
            if (typeof (window.AndroidShareHandler) != 'undefined') {
                // 调用原生 Android 接口
                window.AndroidShareHandler.shareSearch(JSON.stringify(shareData));
            } else if (navigator.share) { // 检查浏览器是否支持 Web Share API
                // 浏览器环境下的分享API
                await navigator.share(shareData);
            } else {
                alert('分享功能不可用或未配置');
            }
        } catch (err) {
            console.error('[Error]: 分享链接时出错!', err);
            alert('[错误]: 分享链接时出错!');
        }
    });
}

2. Android Java 代码示例 (通过 JavascriptInterface 接收):

创建一个Java类作为JavaScript接口,并在其中实现分享逻辑。

import android.content.Context;
import android.content.Intent;
import android.webkit.JavascriptInterface;
import org.json.JSONObject;

public class JavaScriptShareInterface {
    private Context app_context;

    public JavaScriptShareInterface(Context context) {
        this.app_context = context;
    }

    @JavascriptInterface // 必须添加此注解,以便 JavaScript 可以调用此方法
    public void shareSearch(String javascript_data) {
        try {
            JSONObject search = new JSONObject(javascript_data);
            String title = search.getString("title");
            String text = search.getString("text");
            String url = search.getString("url");
            String content = title + "\n" + text + "\n\n" + url;

            Intent sendIntent = new Intent(Intent.ACTION_SEND);
            sendIntent.setType("text/plain");
            sendIntent.putExtra(Intent.EXTRA_TEXT, content);

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1946

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1168

2024.11.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1902

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2387

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

235

2023.12.07

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号