Andorid url链接跳转到APP中的指定界面
·
这种能力在 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 文件。
-
生成文件:运行命令生成指纹(替换为你的包名):
bash
运行
adb shell dumpsys package d | grep -A 2 your.package.name或者在 Android Studio 中查看:
Run > App Links Assistant。 -
文件内容格式:
json
[ { "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "com.example.myapp", // 你的App包名 "sha256_cert_fingerprints": ["你的SHA-256指纹"] } } ] -
上传位置:将此文件上传到你的服务器根目录:
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;
}
}
}
}
}
更多推荐


所有评论(0)