Android页面跳转协议_URL Scheme详解

发布于 2022-06-21 11:59:23

什么是 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&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文件配置如下:

<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

其他运用方式都基于样例

作者:一笑小先生
链接:https://www.jianshu.com/p/386416422140
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 条评论

发布
问题