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