您的位置:

Android URL Scheme 全方位解析

一、URL Scheme 概述

1、什么是 URL Scheme

在移动开发中,URL Scheme 是一种特殊的链接,可以用来唤起 APP 并执行对应的操作。URL Scheme 通过协议头(如:http、https、ftp 等)来识别链接的类型,通过 host 和 path 参数来识别链接的子类型。在 Android 开发中,我们使用 intent-filters 来注册 URL Scheme,以从系统中接收对应的 Intent。

2、URL Scheme 的优点

· 方便使用:用户可以通过浏览器、邮件、短信等多种方式触发 URL Scheme,并打开相应的 APP。

· 常用功能:URL Scheme 可以实现应用内跳转、分享内容、执行系统操作等常用功能。

· 多个 APP 协同:URL Scheme 可以实现多个 APP 间的协同,比如调用支付宝 APP 完成付款等。

二、URL Scheme 的注册和调用

1、URL Scheme 的注册

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="myscheme" android:host="mypage" />
    </intent-filter>
</activity>

· 在 AndroidManifest.xml 文件中,我们需要为对应的 Activity 注册一个 intent-filter。

· action 参数固定为 android.intent.action.VIEW。

· category 参数固定为 android.intent.category.DEFAULT。

· data 参数用来定义 URL Scheme 的协议头和 host 名称。

2、URL Scheme 的调用

Uri uri = Uri.parse("myscheme://mypage?param1=value1&param2=value2");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

· 我们可以通过 Uri.parse(String uriString) 方法将字符串转换为 Uri 对象。

· 我们通过 Intent(Intent.ACTION_VIEW, uri) 构造方法创建一个 Intent,用于跳转到对应的 Activity。

· 我们使用 startActivity(intent) 方法执行跳转。

三、URL Scheme 的参数传递

1、获取 URL Scheme 中的参数

Intent intent = getIntent();
if (intent != null) {
    Uri uri = intent.getData();
    if (uri != null) {
        String param1 = uri.getQueryParameter("param1");
        String param2 = uri.getQueryParameter("param2");
    } 
}

· 我们使用 getIntent() 方法获取当前 Activity 的 Intent 对象。

· 我们使用 uri.getQueryParameter(String key) 方法获取 URL Scheme 的参数。

2、在 URL Scheme 中传递数据和文件

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="myscheme" android:host="mypage" />
        <data android:scheme="file" />
        <data android:scheme="content" />
        <data android:mimeType="*/*" />
    </intent-filter>
</activity>

· 我们可以通过添加多个 data 标签,来实现 URL Scheme 和数据文件的传递。

· 在 AndroidManifest.xml 中,我们可以通过 mimeType 参数来指定支持的文件类型。

四、URL Scheme 的跳转进阶

1、暗示式 Intent 传递参数

Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("myscheme://mypage");
intent.setData(uri);
intent.putExtra("param1", "value1");
intent.putExtra("param2", "value2");
startActivity(intent);

· 使用 setData(Uri data) 方法来设置 Intent 中的 Uri 参数。

· 使用 putExtra(String key, Bundle value) 方法来传递额外的 Bundle 类型数据。

2、使用 FLAG_ACTIVITY_NEW_TASK 参数启动 Activity

Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("myscheme://mypage");
intent.setData(uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

· 使用 setFlags(int flags) 方法并添加 Intent.FLAG_ACTIVITY_NEW_TASK 标志,可以实现在新任务栈中启动 Activity。

五、错误处理和安全机制

1、判断 URL Scheme 是否可用

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("myscheme://mypage?param1=value1&param2=value2");
intent.setData(uri);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
} else {
    Toast.makeText(MainActivity.this, "未安装对应应用", Toast.LENGTH_SHORT).show();
}

· 可以通过调用 Intent.resolveActivity(PackageManager pm) 方法来判断 URL Scheme 是否可用。

· 如果返回 null,则代表没有对应的 APP 能够处理该 Url。

2、Prevent XSS 攻击

XSS(跨站脚本)是一种常见的 Web 攻击。为了避免 XSS 攻击,我们需要对从 URL Scheme 中获取的参数进行安全处理,比如使用 UrlEncode 分隔符编码,或不接受外部不可信数据。

六、总结

通过本文的讲解,我们了解了 Android URL Scheme 的概念、注册和调用方法,以及参数传递、跳转进阶、错误处理和安全机制等相关知识。对于移动开发工程师来说,掌握 URL Scheme 的使用技巧至关重要,可以帮助我们更好地实现 APP 功能,提升用户体验。