• Android页面跳转协议_URL Scheme详解


    什么是 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 等。如果我们自定义协议就可以随意使用一些字符串来限定协议。当然最好是有一定含义的字符串。如下面的协议:

    1. wangyy://ricky@com.wangyy.sample:8888/goodDetail?param1=参数1&param2=参数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文件配置如下:

    1. <activity android:name=".SchemeActivity">
    2. <intent-filter>
    3. <action android:name="android.intent.action.VIEW" />
    4. <category android:name="android.intent.category.BROWSABLE" />
    5. <category android:name="android.intent.category.DEFAULT" />
    6. <data
    7. android:host="com.wangyy.sample"
    8. android:path="/goodsDetail"
    9. android:port="8888"
    10. android:scheme="wangyy" />
    11. </intent-filter>
    12. </activity>

    SchemeActivity

    1. class SchemeActivity : AppCompatActivity() {
    2. override fun onCreate(savedInstanceState: Bundle?) {
    3. super.onCreate(savedInstanceState)
    4. setContentView(R.layout.activity_scheme)
    5. val data = intent.data
    6. Log.i("TAG", "host = ${data.host} path = ${data.path} query = ${data.query}")
    7. val param = data.getQueryParameter("goodsId")
    8. Log.i("TAG", "param: $param")
    9. }
    10. }

    1. H5唤起APP界面

    在网页中调用:

    <a href="wangyy://com.wangyy.sample:8888/goodsDetail?goodsId=10011002">打开商品详情</a>
    
    404?,试试系统自带浏览器或者谷歌浏览器吧。肯定能成功的。

    2. APP内跳转界面

    1. class MainActivity : AppCompatActivity() {
    2. override fun onCreate(savedInstanceState: Bundle?) {
    3. super.onCreate(savedInstanceState)
    4. setContentView(R.layout.activity_main)
    5. helloBtn.setOnClickListener {
    6. val intent = Intent(Intent.ACTION_VIEW,
    7. Uri.parse("wangyy://com.wangyy.sample:8888/goodsDetail?goodsId=10011002"))
    8. startActivity(intent)
    9. }
    10. }
    11. }

    运行结果如下:

    1. 01-11 11:18:55.542 7920-7920/com.wangyy.example I/TAG: host = com.wangyy.sample path = /goodsDetail query = goodsId=10011002
    2. 01-11 11:18:55.542 7920-7920/com.wangyy.example I/TAG: param: 10011002

    其他运用方式都基于样例

  • 相关阅读:
    ai智能外呼机器人的功能,机器人对话常用语模板搭建
    P23~33第7章 一阶电路和二阶电路的时域分析 详情可以看看书
    C++学习之引用
    (转)SpringCloud网关的解决方案
    Linux学习---uboot入门
    vue3+vite+nodejs,通过接口的形式请求后端打包(可打包全部或指定打包组件)
    redis群集有三种模式(主从同步/复制、哨兵模式、Cluster)
    Flask练手
    软件开发项目文档系列之七软件详细设计:从概要到细节的深化历程
    hw0906
  • 原文地址:https://blog.csdn.net/weixin_47458273/article/details/126408815