android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
客户端应用可以在服务端注册一个URL Scheme,该Scheme用于从浏览器或其他应用启动本应用。通过指定的URL字段,可以让应用在被调起后直接打开某些特定界面,比如商品详情页,活动详情页等。也可以执行某些特定的动作,如完成支付等。也可以在应用内通过html页来直接调用显示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#片段"
首先配置需要跳转的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
其他运用方式都基于样例