这种能力在 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:协议。必须设置,http 或 https 最通用。
  • 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。你需要在 onCreate 或 onNewIntent 中解析数据。

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;
                }
            }
        }
    }
}

更多推荐