什么是 URL Scheme?
android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
URL Schema应用场景
客户端应用可以在服务端注册一个URL Scheme,该Scheme用于从浏览器或其他应用启动本应用。通过指定的URL字段,可以让应用在被调起后直接打开某些特定界面,比如商品详情页,活动详情页等。也可以执行某些特定的动作,如完成支付等。也可以在应用内通过html页来直接调用显示app内的某个界面。综上URL Schema使用场景大致分以下几种:
- 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
- H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
- APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
- APP根据URL跳转到另外一个APP指定页面
URL Schema协议格式
一个完整的Scheme的协议格式由 scheme、userInfo、host、port、path、query和fragment 组成。结构如下:
scheme://userInfo@host:port/path?query#fragment
scheme://是固定的格式。userInfo@ 可以省略,host 是必须的。port 、query 和 fragment 也是可以省略的。
其中scheme既可以是Android已经定义好的协议,也可使用我们自定义的。Android 常见的scheme 协议有:content 、file、http 等。如果我们自定义协议就可以随意使用一些字符串来限定协议。当然最好是有一定含义的字符串。如下面的协议:
wangyy://ricky@com.wangyy.sample:8888/goodDetail?param1=参数1¶m2=参数2#片段"
- wangyy : 即为 Scheme ,即我们自定义的Scheme 协议名称
- ricky :即为用户信息,注意它跟host 之间一定要跟上 @ 符号
- com.wangyy.sample : 即为 host ;这里我用了一个包名
- 8888 : 即为 port ;自定义协议的端口号
-goodDetail: 即为path ,路径;代表scheme的指定的页面,我们匹配页面的时候,这里就是匹配的重点 - param1 和 param2:即为 query ,代表我们跳转到指定界面后传递的参数
- 片段:即为fragment,也可以把它看成跳转到指定界面后传递的参数,只不过它只能传递一个,而query 可以传递多个它会把 #后的所有的内容都看成一个片段。
Android中 URL Scheme的使用
首先配置需要跳转的Activity,Mainifest文件配置如下:
<activity android:name=".SchemeActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="com.wangyy.sample"
android:path="/goodsDetail"
android:port="8888"
android:scheme="wangyy" />
</intent-filter>
</activity>
SchemeActivity
class SchemeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_scheme)
val data = intent.data
Log.i("TAG", "host = ${data.host} path = ${data.path} query = ${data.query}")
val param = data.getQueryParameter("goodsId")
Log.i("TAG", "param: $param")
}
}
1. H5唤起APP界面
在网页中调用:
<a href="wangyy://com.wangyy.sample:8888/goodsDetail?goodsId=10011002">打开商品详情</a>
404?,试试系统自带浏览器或者谷歌浏览器吧。肯定能成功的。
2. APP内跳转界面
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
helloBtn.setOnClickListener {
val intent = Intent(Intent.ACTION_VIEW,
Uri.parse("wangyy://com.wangyy.sample:8888/goodsDetail?goodsId=10011002"))
startActivity(intent)
}
}
}
运行结果如下:
01-11 11:18:55.542 7920-7920/com.wangyy.example I/TAG: host = com.wangyy.sample path = /goodsDetail query = goodsId=10011002
01-11 11:18:55.542 7920-7920/com.wangyy.example I/TAG: param: 10011002
其他运用方式都基于样例,源码地址:URL_SchemeDemo