Scheme协议在Android中使用场景
H5页面和Native页面的交互
客户端获取push消息中后,点击消息跳转到APP内部页面
APP根据URL跳转到另外一个APP指定页面
外部浏览器唤醒App
Scheme协议的使用
- 场景一 外部浏览器唤醒app
以app://test/good?goodsId=3
这个内链为例, 假设浏览器中点击该内链需要跳转到应用的指定Activity
那么,首先在清单文件中对指定Activity进行intent过滤配置:
1 | <activity |
然后在Activity
的onCreate
方法中进行参数的获取和逻辑的处理:
1 | Uri data = getIntent().getData(); |
最后测试跳转即可
场景二 应用内部H5交互(页面跳转)
还是以
app://test/good?goodsId=3
这个内链为例, 假设WebView中点击该内链需要跳转到应用的指定Activity首先还是在清单文件中配置,如上
然后配置webview:
1
2
3
4override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
startActivity(Intent(Intent.ACTION_VIEW, url.toUri()))
return true
}因为webview属于开发者自定义, 因此内链跳转逻辑需要在
shouldOverrideUrlLoading
方法中自行处理场景三 应用内部H5交互(非页面跳转)
有时候需求不单单是页面的跳转, 可能还涉及到其他ui或者逻辑的交互, 比如跳转到支付宝失败后弹出弹窗等等, 这个时候,我们需要在
shouldOverrideUrlLoading
方法中进行不同scheme的处理:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21override 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
}场景四 应用内Activity之间的跳转
首先依然在清单文件中配置
然后使用隐式跳转:
1
startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse("`app://test/good?goodsId=3`")))
多个不同scheme跳转同一个页面
只需要在清单文件增加多个data
标签即可:
1 | <activity |
使用pathPattern匹配模式
1 | <data |
1 | .表示匹配任意字符 *表示匹配0次或多次 遗憾的是pathPattern无法使用标准的正则表达式 只有* 和.可用 |
关于sspPattern匹配模式
我们使用内链的格式一般和url
格式一致,比如app://test
, 如果我们想使用自定义格式比如这种app:test
, 那常规的方法则不奏效,此时sspPattern
就可以派上用场
我们在清单文件中如下配置即可:
1 | <data |
同样该模式下对应三个属性:
- ssp :字面值匹配模式(PATTERN_LITERAL) 内部采用equals函数
- sspPrefix 前缀匹配模式(PATTERN_PREFIX) 内部采用startWith函数
- sspPattern 全局匹配模式(PATTERN_GLOB) glob规则是一种简化的模式,只支持“*”和“.”作为通配符
实际上类似于url格式的内链, 比如app://test
也可以使用ssp
进行匹配:
1 | <data |
不过一般我们不会这么做, 因为直接使用host
属性更加简洁
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站