一、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¶m2=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¶m2=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 功能,提升用户体验。