zoukankan      html  css  js  c++  java
  • Android业务组件化之URL Scheme使用

    前言:

         最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在预研阶段,很有必要先了解一下URL Scheme,看看是如何使用的?其实在之前做Hybrid混合编程的时候就接触过URL Scheme,总来的来说还不算陌生,今天就来回顾总结一下。业务组件化相关博客地址(Android业务组件化之现状分析与探讨

       业务组件化相关文章地址:

    什么是 URL Scheme?

        android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。

    URL Scheme应用场景:

        客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如商品详情页、活动详情页等等。也可以执行某些指定动作,如完成支付等。也可以在应用内通过 html 页来直接调用显示 app 内的某个页面。综上URL Scheme使用场景大致分以下几种:

    • 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
    • H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
    • APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
    • APP根据URL跳转到另外一个APP指定页面

    URL Scheme协议格式:

       先来个完整的URL Scheme协议格式:

    xl://goods:8888/goodsDetail?goodsId=10011002

    通过上面的路径 Scheme、Host、port、path、query全部包含,基本上平时使用路径就是这样子的。

    • xl代表该Scheme 协议名称
    • goods代表Scheme作用于哪个地址域
    • goodsDetail代表Scheme指定的页面
    • goodsId代表传递的参数
    • 8888代表该路径的端口号

    URL Scheme如何使用:

     1.)在AndroidManifest.xml中对<activity />标签增加<intent-filter />设置Scheme

        <activity
                android:name=".GoodsDetailActivity"
                android:theme="@style/AppTheme">
                <!--要想在别的App上能成功调起App,必须添加intent过滤器-->
                <intent-filter>
                    <!--协议部分,随便设置-->
                    <data android:scheme="xl" android:host="goods" android:path="/goodsDetail" android:port="8888"/>
                    <!--下面这几行也必须得设置-->
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.BROWSABLE"/>
                </intent-filter>
            </activity>

     2.)获取Scheme跳转的参数

    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);
    }

    3.)调用方式

    网页上

    <a href="xl://goods:8888/goodsDetail?goodsId=10011002">打开商品详情</a>

    原生调用

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

     4.)如何判断一个Scheme是否有效

    PackageManager packageManager = getPackageManager();
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    boolean isValid = !activities.isEmpty();
    if (isValid) {
        startActivity(intent);
    }

    总结:

       Scheme的基本使用也就这么多了,其他的使用在以后用到的时候再做总结。

  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5825333.html
Copyright © 2011-2022 走看看