Android应用间调用方式——URL Scheme

URL Scheme简介

URL Scheme是Android中的自定义的URL Scheme是一种页面内跳转协议,也可以被称为URLRouter,就是通过类似打开网页的方式去通过路由打开一个Activity,而非直接通过显式Intent方式去进行跳转。

协议格式

协议格式:由scheme、host、port、path、query组成。
://:/?
例如:jqchen://android:8088/urlscheme?id=3919

  1. jqchen,即为Scheme,代表该Scheme 协议名称
  2. android,即为Host,代表Scheme作用于哪个地址域
  3. 8088,即为port,代表该路径的端口号
  4. urlscheme,即为path, 代表Scheme指定的页面
  5. 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>
    
    <intent-filter>
        
        <action android:name="android.intent.action.VIEW" />
        
        <category android:name="android.intent.category.DEFAULT" />
        
        
        <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);
}

致谢

感谢阅读,欢迎点赞和评论!

你可能感兴趣的:(Android开发)