关于android scheme跳转配置中pathPattern的使用

Scheme协议在Android中使用场景

  1. H5页面和Native页面的交互

  2. 客户端获取push消息中后,点击消息跳转到APP内部页面

  3. APP根据URL跳转到另外一个APP指定页面

  4. 外部浏览器唤醒App

Scheme协议的使用

  1. 场景一 外部浏览器唤醒app

app://test/good?goodsId=3这个内链为例, 假设浏览器中点击该内链需要跳转到应用的指定Activity

那么,首先在清单文件中对指定Activity进行intent过滤配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<activity
android:name=".ui.login.LoginActivity"
android:screenOrientation="portrait">
<intent-filter>
<!--可以根据用户的数据类型,打开相应的Activity-->
<action android:name="android.intent.action.VIEW" />
<!--界面可以被隐式调用-->
<category android:name="android.intent.category.DEFAULT" />
<!--界面可以通过浏览器的连接启动-->
<category android:name="android.intent.category.BROWSABLE" />
<!--协议部分,主要是配置scheme和host-->
<data
android:path="/good"
android:host="test"
android:scheme="app" />
</intent-filter>
</activity>

然后在ActivityonCreate方法中进行参数的获取和逻辑的处理:

1
2
Uri data = getIntent().getData();
String param = data.getQueryParameter("goodsId");//获取指定key下的参数

最后测试跳转即可

  1. 场景二 应用内部H5交互(页面跳转)

    还是以app://test/good?goodsId=3这个内链为例, 假设WebView中点击该内链需要跳转到应用的指定Activity

    首先还是在清单文件中配置,如上

    然后配置webview:

    1
    2
    3
    4
    override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
    startActivity(Intent(Intent.ACTION_VIEW, url.toUri()))
    return true
    }

    因为webview属于开发者自定义, 因此内链跳转逻辑需要在shouldOverrideUrlLoading方法中自行处理

  2. 场景三 应用内部H5交互(非页面跳转)

    有时候需求不单单是页面的跳转, 可能还涉及到其他ui或者逻辑的交互, 比如跳转到支付宝失败后弹出弹窗等等, 这个时候,我们需要在shouldOverrideUrlLoading方法中进行不同scheme的处理:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
    if (url.startsWith("alipay")) {
    try {
    startActivity(Intent(Intent.ACTION_VIEW, url.toUri()))
    } catch (e: Exception) {
    e.printStackTrace()
    AlertDialog.Builder(requireContext())
    .setMessage("未检测到支付宝客户端,请安装后重试。")
    .setPositiveButton("") { _, _ ->
    startActivity(
    Intent(
    Intent.ACTION_VIEW,
    "https://d.alipay.com".toUri()
    )
    )
    }
    .setNegativeButton("取消", null).show()
    }
    }
    return true
    }
  3. 场景四 应用内Activity之间的跳转

    首先依然在清单文件中配置

    然后使用隐式跳转:

    1
    startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse("`app://test/good?goodsId=3`")))

多个不同scheme跳转同一个页面

只需要在清单文件增加多个data标签即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<activity
android:name=".ui.login.LoginActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data
android:path="/good"
android:host="test"
android:scheme="app" />


<data
android:host="test2"
android:scheme="app" />
</intent-filter>
</activity>

使用pathPattern匹配模式

1
2
3
4
<data
android:pathPattern="/.*"
android:host="test"
android:scheme="app" />
1
.表示匹配任意字符 *表示匹配0次或多次  遗憾的是pathPattern无法使用标准的正则表达式 只有* 和.可用

关于sspPattern匹配模式

我们使用内链的格式一般和url格式一致,比如app://test, 如果我们想使用自定义格式比如这种app:test, 那常规的方法则不奏效,此时sspPattern就可以派上用场

我们在清单文件中如下配置即可:

1
2
3
<data
android:ssp="test"
android:scheme="app" />

同样该模式下对应三个属性:

  • ssp :字面值匹配模式(PATTERN_LITERAL) 内部采用equals函数
  • sspPrefix 前缀匹配模式(PATTERN_PREFIX) 内部采用startWith函数
  • sspPattern 全局匹配模式(PATTERN_GLOB) glob规则是一种简化的模式,只支持“*”和“.”作为通配符

实际上类似于url格式的内链, 比如app://test也可以使用ssp进行匹配:

1
2
3
<data
android:ssp="//test"
android:scheme="app" />

不过一般我们不会这么做, 因为直接使用host属性更加简洁

本文为作者原创 转载时请注明出处 谢谢

img

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%