利用URL Scheme打开APP并传递数据

利用外部链接打开APP并传递一些附带信息是现在很多APP都有的功能,我在这把这部分的知识记录一下。

1、什么是URL Scheme?

android中的scheme是一种页面内跳转协议,是一种非常好的机制,通过自己在AndroidManifest.xml文件里面定义自己的scheme协议,可以非常方便的跳转到App的各个页面。通过scheme协议,甚至可以跳转到App的某个页面,可以通过直接输入URL进行跳转,也可以把URL写进HTML页面进行跳转。

2、实现的大致流程

我们手机的APP可以向操作系统注册一个URL Scheme,该scheme用于从浏览器或其他应用中启动本应用。

3、URL Scheme的协议格式

tlqp://my.app/openwith?roomID=123456

scheme:tlqp 代表Scheme的协议名称(必须)

host:my.app 代表host

path:openwith 代表path

query:roomID=123456 代表URL传递的值

4、设置URL Scheme

<intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
            
<intent-filter>    
    <action android:name="android.intent.action.VIEW"/>    
    <category android:name="android.intent.category.DEFAULT" />    
    <category android:name="android.intent.category.BROWSABLE" />    
    <data android:scheme="tlqp" android:host="my.app" android:pathPrefix="/openwith" />    
</intent-filter>

在AndroidManifest.xml文件,添加以上代码(根据情况适当修改),这里需要注意的地方是,不能再上面的Intent-filter里面添加相关代码,因为那里面存在MAIN和LAUNCHER相关代码,混在一起的话,会造成App图标丢失的情况。需要新建一个intent-filter,然后把代码添加进去即可。


5、获取URL附带的参数

Uri uri = getIntent().getData();
if (uri != null) {
    // 完整的url信息
    String url = uri.toString();
    Log.e(TAG, "url: " + uri);
    // scheme部分
    String scheme = uri.getScheme();
    Log.e(TAG, "scheme: " + scheme);
    // host部分
    String host = uri.getHost();
    Log.e(TAG, "host: " + host);
    //port部分
    int port = uri.getPort();
    Log.e(TAG, "host: " + port);
    // 访问路劲
    String path = uri.getPath();
    Log.e(TAG, "path: " + path);
    List<String> pathSegments = uri.getPathSegments();
    // Query部分
    String query = uri.getQuery();
    Log.e(TAG, "query: " + query);
    //获取指定参数值
    String goodsId = uri.getQueryParameter("goodsId");
    Log.e(TAG, "goodsId: " + goodsId);
}

6、打开app的方式

可以把URL写进HTML里面通过点击网页链接打开APP

<html>
 
    <head>
 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
        <title>Insert title here</title>
 
    </head>
 
    <body>
 
        <a href="tlqp://my.app/openwith?roomID=203518">打开app</a><br/>
 
    </body>
 
</html>

原生调用方式:

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
  startActivity(intent);

后记:目前有一部分浏览器是打不开App的,例如;qq浏览器,UC浏览器这些,百度浏览器也有可能打不开,原因是这些浏览器都在你的Scheme前面加上了http://,从而造成了scheme失效。还有一点需要注意,就是上面说到的url里面的path这个参数,如果你的path包含了其他的path,那么你调用这个包含其他path的path,可能会在打开第一个path对应的页面的同时也会打开被包含path的那个页面,有点绕口么~举个栗子吧

<a href="tlqp://my.app/hello?roomID=123456">打开hello</a> 吊起hello,没问题
<a href="tlqp://my.app/helloworld?roomID=123456">打开helloworld</a> 这个会吊起hello和helloworld。

 

posted on 2019-07-10 02:17  &大飞  阅读(691)  评论(0编辑  收藏  举报

导航