URL Scheme简介
URL Scheme是Android中的自定义的URL Scheme是一种页面内跳转协议,也可以被称为URLRouter,就是通过类似打开网页的方式去通过路由打开一个Activity,而非直接通过显式Intent方式去进行跳转。
协议格式
协议格式:由scheme、host、port、path、query组成。
<scheme>://<host>:<port>/<path>?<query>
例如:jqchen://android:8088/urlscheme?id=3919
- jqchen,即为Scheme,代表该Scheme 协议名称
- android,即为Host,代表Scheme作用于哪个地址域
- 8088,即为port,代表该路径的端口号
- urlscheme,即为path, 代表Scheme指定的页面
- id,即为query,代表传递的参数
使用方法
第一步, 在AndroidManifest.xml中对标签增加设置Scheme
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--URL Scheme启动-->
<intent-filter>
<!--必有项-->
<action android:name="android.intent.action.VIEW" />
<!--表示该页面可以被隐式调用,必须加上该项-->
<category android:name="android.intent.category.DEFAULT" />
<!--如果希望该应用可以通过浏览器的连接启动,则添加该项-->
<category android:name="android.intent.category.BROWSABLE" /
<!--URL Scheme协议部分-->
<data
android:host="android"
android:path="/urlscheme"
android:port="8088"
android:scheme="jqchen" />
</intent-filter>
</activity>
上边配置文件中配置了两组,第一组是作为应用的默认启动Activity配置,第二组是通过URL Scheme方式启动,其本身也是隐式启动的一种,不同在于添加了属性,定义了其接受URL Scheme协议格式为jqchen://android:8088/urlscheme
组成URI的这些属性在中都是可选的,但是存在如下制约关系:
- 如果没有指定scheme,那么host参数会被忽略
- 如果没有指定host,那么port参数会被忽略
- 如果scheme和host都没有指定,path参数会被忽略
当intent对象中的URI中的参数与intent-filter中的标签指定的URI格式进行对比,只对比intent-filter的标签指定的部分,例如:
- 如果intent-filter中只指定了scheme,那么所有带有该sheme的URI都能匹配到该intent-filter。
- 如果intent-filter中只指定了scheme和authority(authority包括host和port两部分)而没有指定path,那么所有具有相同scheme和authority的URI都能匹配到该intent-filter,而不用考虑path为何值。
- 如果intent-filter中同时指定了scheme、authority和path,那么只有具有相同scheme、authority和path的URI才能匹配到该intent-filter。
第二步 ,使用URL启动Activity
// url scheme
String url = "jqchen://android:8088/urlscheme?id=3919";
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(null);
intent.setSelector(null);
if (checkUrlScheme(intent)) {
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
}// 检查url scheme 是否有效
boolean checkUrlScheme(Intent intent) {
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
return !activities.isEmpty();
}
第三步,提取scheme参数
private void handlerIntent() {
Intent intent = getIntent();
if (null == intent) {
System.out.println("intent == null");
return;
}
Uri uri = intent.getData();
if (null == uri) {
System.out.println("uri == null");
return;
}
// 完整的URL信息
String url = uri.toString();
System.out.println("URL = " + url);
// Scheme
String scheme = uri.getScheme();
System.out.println("Scheme = " + scheme);
// Host
String host = uri.getHost();
System.out.println("Host = " + host);
// port
int port = uri.getPort();
System.out.println("Port = " + port);
// path
String path = uri.getPath();
System.out.println("Path = " + path);
// query
String query = uri.getQuery();
System.out.println("Query = " + query);
}
致谢
感谢阅读,欢迎点赞和评论!