精华内容
下载资源
问答
  • 快手_Scheme协议.txt

    2019-10-31 12:03:21
    文档的内容为 快手应用的一些 scheme跳转信息,我们可以在自己的应用内部直接唤起快手的指定界面,无论是从H5还是原生界面,包括直接跳转到某用户的主页,直接与某用户发起对话等
  • 详见http://blog.csdn.net/huaxun66/article/details/78274600
  • Android中使用Scheme协议打开App URL Scheme URL Scheme是一种页面内跳转协议,通过定义自己的URL Scheme协议,可以 从一个APP中打开另外一个APP指定的页面,也可以从H5页面中跳转到APP指定的页面(实际上就是从一个...

    Android正确使用Scheme协议打开App,兼容浏览器scheme的二次跳转


    URL Scheme

    URL Scheme是一种页面内跳转协议,通过定义自己的URL Scheme协议,可以实现

    1. 从一个APP中打开另外一个APP指定的页面
    2. 从H5页面中跳转到APP指定的页面(实际上就是从一个浏览器中的一个页面跳转到APP指定页面)。

    URL Scheme协议格式:
    一个完整的完整的URL Scheme协议格式由scheme、host、port、path和query组成,其结构如下所示:

    <scheme>://<host>:<port>/<path>?<query>
    

    如下就是一个自定义的URL
    openapp://hhong:80/product?productId=10000007
    openapp: 即Scheme 该Scheme协议名称(必填)
    hhong: 即Host,代表Scheme作用于哪个地址域(必填)
    80: 即port,代表端口号
    product:即path,代表打开的页面
    param: 即query,代表传递的参数

    传递参数的方法跟web端一样,通过问号?分隔,参数名和值之间使用等号=连接,多个参数之间使用&拼接。

    Scheme使用

    既然我们使用scheme来做打开app并跳转的逻辑,那这个scheme应该声明在哪里比较合适呢?如果你的应用在启动页(splash)或者在主界面(main)初始化了一些必要的设置,比如必要的token信息检查交易或者一些其它校验等,没有这些信息会造成崩溃的,这个时候我们就需要在启动页来声明这个scheme了,获取scheme信息保存起来,然后在主界面做处理逻辑,如跳转到其它界面等。当然你也可以声明scheme在其它地方,具体得需要看怎么实现业务比较方便。

    scheme跳转
    scheme跳转
    APP1
    APP2启动页保存参数
    浏览器
    APP2主页
    APP2具体页面

    如配置SplashActivity完整的打开链接为openapp://hhong:80/product?param=100,需要在AndroidManifest.xml配置(SplashActivity启动模式为默认standard模式)

            <activity android:name=".SplashActivity">
    
                <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:host="hhong"
                        android:path="/product"
                        android:port="80"
                        android:scheme="openapp" />
                </intent-filter>
            </activity>
    

    定义好scheme相关的参数后,现在我们需要用scheme调起目标app,主要有两种方式

    1. APP中打开另一个APP指定的页面
    String url = "openapp://hhong:80/product?productId=10000007";
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    String intentUri = intent.toUri(Intent.URI_INTENT_SCHEME);
    Log.e(TAG, "action是:" + intentUri);
    startActivity(intent);
    

    这种方式的跳转比较简单,也是最不容易出错的。

    1. 浏览器中的一个页面跳转到APP指定页面

    这种方式的跳转可能同样的代码会导致不同的结果,因为涉及到浏览器,而不同的手机厂商不能保证所有的浏览器内核是一样的,进而可能对scheme的处理也是不一样。
    前提:项目用的框架是蚂蚁的MPASS,这个项目可能和正常工程项目不同,因为框架对项目的启动方式做了封装,有兴趣的同学也可以去看下这个框架。
    问题:app未启动时,由微信分享出来的链接然后在华为浏览器打开这个链接跳转到指定app时(非桌面图标启动app),第一次是能正常跳转到指定页面,但是app切到后台时,再在华为浏览器打开链接发现竟然不做跳转了,只是将应用切回前台页面,但在小米手机上同样的操作,好像又是正常的,这个把我们搞得一脸懵逼,我们猜测是否和浏览器内核有关,于是我们在Android 自带WebView做scheme的跳转,发现也是正常的。

    <div>
        <a href="openapp://hhong:80/product?productId=10000007"></a>
    </div>
    

    还有就是浏览器上的scheme跳转,Android这边怎么处理的呢?scheme启动Activity其实用的就是Intent,细心的你肯定发现了第一种方式:APP中打开另一个APP指定的页面的跳转,log打印了一个intentUri:

       String intentUri = intent.toUri(Intent.URI_INTENT_SCHEME);
       Log.e(TAG, "action是:" + intentUri);
    

    打印的结果:

    E/MainActivity: action是:intent://hhong:80/product?productId=10000007#Intent;scheme=openapp;end
    

    如果我们在方式1中把intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)加上,打印的结果:

    E/MainActivity: action是:intent://hhong:80/product?productId=10000007#Intent;scheme=openapp;launchFlags=0x10000000;end
    

    相比之下,多了个launchFlags字段值,这个值在二次跳转起着重要作用(SplashActivity启动模默认standard),Android FLAG标识和启动模式关系可以看下这两篇文章Android Intent FLAG详解,包括其他的标记的一些解释Android之点击Home键后再次打开导致APP重启问题,我们把项目SplashActivity的启动模式改为singleTask就完美的实现了我们的需求,此时mpass工程点击桌面图标并不会重新走开屏页SplashActivity。
    其实华为推送通知跳转到指定页面时,在控制台上配置的就是这个intent,有兴趣的同学可以去看下华为推送官方文档,看下他们如何定义intent的,所以对于Android来说上面的href标签也可以写成这样:

    <div>
        <a href="intent://hhong:80/product?productId=10000007#Intent;scheme=openapp;end"></a>
    </div>
    

    这两种方式是一样的效果,但是我们从华为浏览器scheme跳转打开app拦截到的intent是携带了FLAG,intent还有些其它的信息,如页面appfilterctrl、当前由哪个应用跳转的application_id。下面是我用正常工程测试浏览器scheme启动跳转app拦截到的intent(测试机是华为手机,可能不同的手机有不同的效果):

    华为浏览器
    intent://hhong:80/product?productId=10000007#Intent;
    scheme=openapp;
    category=android.intent.category.BROWSABLE;
    launchFlags=0x17000000;
    launchHwFlags=0x400;
    component=com.example.aapp/.SplashActivity;end
    
    UC浏览器
    intent://hhong:80/product?productId=10000007#Intent;
    scheme=openapp;
    launchFlags=0x13000000;
    launchHwFlags=0x400;
    component=com.example.aapp/.SplashActivity;end
    
    Android 自带的WebView
    intent://hhong:80/product?productId=10000007#Intent;
    scheme=openapp;
    category=android.intent.category.BROWSABLE;
    launchFlags=0x3000000;
    launchHwFlags=0x400;
    component=com.example.aapp/.SplashActivity;end
    
    桌面图标启动
    intent:#Intent;
    action=android.intent.action.MAIN;
    category=android.intent.category.LAUNCHER;
    launchFlags=0x10200000;
    component=com.example.aapp/.SplashActivity;sourceBounds=792%201686%201044%202001;end
    

    SplashActivity的启动模式都是默认的standard,最终发现UC浏览器启动app后能正常跳转到页面,但是我再次从浏览器scheme启动app时,不会再跳转指定页面,这一点和桌面启动效果类似,点击桌面图标启动app后,再次点击只会把app切到前台。从上面可以看出主要的区别在于launchFlags,如果将SplashActivity启动模式改为singleTask、singleTop、singleInstance又会是怎样呢?

    结论:测试正常工程发现如果SplashActivity的启动模式为standard,scheme二次能否跳转指定页面(能否重新创建SplashActivity)取决于浏览器内核,因为它所携带的launchFlags是不同的;如果SplashActivity的启动模式为singleTask、singleTop、singleInstance,scheme二次都能跳转指定页面,和浏览器内核(携带的launchFlags)无关,但是每次点击桌面图标时都会重新打开app,这个时候我们需要在启动页SplashActivity添加一段代码:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
    //            finish();
    //            return;
    //        }
            // 避免从桌面启动程序后,会重新实例化入口类的activity
            if (!this.isTaskRoot()) {
                Intent intent = getIntent();
                if (intent != null) {
                    String action = intent.getAction();
                    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {
                        finish();
                        return;
                    }
                }
            }
            setContentView(R.layout.activity_splash);
        }
    

    这样就保证了在正常工程下,兼容各种浏览器scheme的二次跳转能正常跳转到指定页面,并且每次点击桌面图标又不会重新打开app了!

    展开全文
  • 通过scheme协议打开app 一、url scheme协议格式: 二、 配置步骤: 1、参照如下配置注册DemoActivity 2、通过scheme协议打开app 3、DemoActivity接收参数: 4、附录:action 和 category类别 扩展、h5页面通过scheme...

    一、url scheme协议格式:

    
     一个完整的完整的 url scheme协议格式由scheme、host、port、path和query组成,其结构如下所示: 
     
     scheme://host:port/path?query
    
     举例:
     coolweather://com.coolWeather.android:8080/WeatherActivity?param1=flag1&param2=flag2
     coolweather://?param1=flag1&param2=flag2
    

    二、 配置步骤:

    1、参照如下配置注册DemoActivity

    
    <activity
        android:name=".DemoActivity"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <!--默认的Category-->
            <category android:name="android.intent.category.DEFAULT" />
            <!--指定该Activity能被浏览器安全调用-->
            <category android:name="android.intent.category.BROWSABLE" />
    
            <data
                android:host="[自定义]"
                android:path="[自定义]"
                android:port="[自定义]"
                android:scheme="[自定义]" />
            </intent-filter>
    </activity>
    
     <!-- 举例
            <data
                android:host="com.coolweather.android"
                android:path="/WeatherActivity"
                android:port="8080"
                 android:scheme="coolweather" />
            -->
            
    

    2、通过scheme协议打开app

    
    private void openOtherApp() {
        //方法1
        String uriString = "android://com.coolWeather.android:8080/WeatherActivity?param1=flag1&param2=flag2";
        Intent intent = new Intent();
        intent.setData(Uri.parse(uriString));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    
        //方法2
        String uriString2 = "android://com.coolWeather.android:8080/WeatherActivity?";
        Intent intent2 = new Intent();
        intent.putExtra("param1", "flag1");
        intent.putExtra("param2", "flag2");
        intent.setData(Uri.parse(uriString));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
    
    

    3、DemoActivity接收参数:

    launchMode= "singleTask’时,需要兼顾onNewIntent接收参数

    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        initData();
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initData();
    }
    
    private void initData() {
        //(参数之间用“&”相连)设置的数据通过如下方式获取
       //String name1 = getIntent.getData().getQueryParameter("name");
       //(intent.putExtra直接添加参数)设置的数据通过如下方式获取
       // String param1 = getIntent.getStringExtra("param1");
       
        Uri uri = getIntent().getData();
        if (uri != null) {
            String scheme = uri.getScheme();
            String host = uri.getHost();
            int port = uri.getPort();
            String path = uri.getPath();
            String query = uri.getQuery();
            String param1 = uri.getQueryParameter("param1");
            String param2 = uri.getQueryParameter("param2");
    
            Log.i(TAG,
                    " uri ->" + uri + "\n"
                            + "scheme->" + scheme + "\n"
                            + "host->" + host + "\n"
                            + "port->" + port + "\n"
                            + "path->" + path + "\n"
                            + "query->" + query + "\n"
                            + "param1->" + param1 + "\n"
                            + "param2->" + param2 + "\n"
            );
    
            //  scheme->    coolweather
            //  host->      com.coolWeather.android
            //  port->      8080
            //  path->      /WeatherActivity
            //  query->     param1=flag1&param2=flag2
            //  param1->    flag1
            //  param2->    flag2
        }
    }
    
    

    4、附录:action 和 category类别

    action

    Action常量对应字符串简单说明
    ACTION_MAINandroid.intent.action.MAIN应用程序入口
    ACTION_VIEWandroid.intent.action.VIEW 显示指定数据
    ACTION_ATTACH_DATAandroid.intent.action.ATTACH_DATA指定某块数据将被附加到其它地方
    ACTION_EDITandroid.intent.action.EDIT编辑指定数据
    ACTION_PICKandroid.intent.action.PICK从列表中选择某项并返回所选的数据
    ACTION_CHOOSERandroid.intent.action.CHOOSER显示一个Activity选择器
    ACTION_GET_CONTENTandroid.intent.action.GET_CONTENT让用户选择数据,并返回所选数据
    ACTION_DIALandroid.intent.action.DIAL显示拨号面板
    ACTION_CALLandroid.intent.action.CALL直接向指定用户打电话
    ACTION_SENDandroid.intent.action.SEND向其他人发送数据
    ACTION_SENDTOandroid.intent.action.SENDTO向其他人发送消息
    ACTION_ANSWERandroid.intent.action.ANSWER应答电话
    ACTION_INSERTandroid.intent.action.INSERT插入数据
    ACTION_DELETEandroid.intent.action.DELETE删除数据
    ACTION_RUNandroid.intent.action.RUN运行维护
    ACTION_SYNCandroid.intent.action.SYNC执行数据同步
    ACTION_PICK_ACTIVITYandroid.intent.action.PICK_ACTIVITY 用于选择Activity
    ACTION_SEARCHandroid.intent.action.SEARCH执行搜索
    ACTION_WEB_SEARCHandroid.intent.action.WEB_SEARCH执行Web搜索
    ACTION_FACTORY_TESTandroid.intent.action.FACTORY_TEST工厂测试的入口点

    category

    Category常量对应字符串简单说明
    CATEGORY_DEFAULTandroid.intent.category.DEFAULT默认的Category
    CATEGORY_BROWSABLEandroid.intent.category.BROWSABLE可以从浏览器安全调用的活动必须支持此类别。
    CATEGORY_TABandroid.intent.category.TAB指定Activity作为TabActivity的Tab页
    CATEGORY_LAUNCHERandroid.intent.category.LAUNCHER Activity显示顶级程序列表中
    CATEGORY_INFOandroid.intent.category.INFO 用于提供包信息
    CATEGORY_HOMEandroid.intent.category.HOME 设置该Activity随系统启动而运行
    CATEGORY_PREFERENCEandroid.intent.category.PREFERENCE 该Activity是参数面板
    CATEGORY_TESTandroid.intent.category.TEST该Activity是一个测试
    CATEGORY_CAR_DOCKandroid.intent.category.CAR_DOCK 指定手机被插入汽车底座(硬件)时运行该Activity
    CATEGORY_DESK_DOCKandroid.intent.category.DESK_DOCK 指定手机被插入桌面底座(硬件)时运行该Activity
    CATEGORY_CAR_MODEandroid.intent.category.CAR_MODE设置该Activity可在车载环境下使用

    安卓开发者官网对action 和 category的解释:

    在这里插入图片描述

    Intent 和 Intent 过滤器:
    https://developer.android.google.cn/guide/components/intents-filters?hl=zh_cn

    action 和 category官方解释:
    https://developer.android.google.cn/reference/android/content/Intent?hl=zh_cn

    扩展、h5页面通过scheme协议打开app:

    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <a href="coolweather://com.coolWeather.android:8080/WeatherActivity?param1=flag1&param2=flag2">打开app</a>
    </body>
    </html>
    
    

    文章由个人搜集资料总结,如有错误,欢迎指证!

    展开全文
  • Scheme协议详细介绍

    2018-08-03 15:08:09
    目录介绍 1.URL Scheme使用场景介绍 ...2.2 URL Scheme协议格式解释 2.3 Scheme链接格式样式 3.URL Scheme如何使用 3.1 设置Scheme 3.2 获取Scheme跳转的参数,并添加跳转方式 3.3 调用方式 ...

    目录介绍

    • 1.URL Scheme使用场景介绍
    • 2.URL Scheme基础介绍

      • 2.1 什么是URL Scheme?
      • 2.2 URL Scheme协议格式解释
      • 2.3 Scheme链接格式样式
    • 3.URL Scheme如何使用

      • 3.1 设置Scheme
      • 3.2 获取Scheme跳转的参数,并添加跳转方式
      • 3.3 调用方式
      • 3.4 如何判断一个Scheme是否有效
      • 3.5 Scheme在短信息中注意要点

    关于Scheme应用案例

    关于链接

    1.URL Scheme使用场景介绍

    • URL Scheme使用场景,目前1,2,5使用场景很广,有没有一种熟悉的感觉?

      * 1.通过小程序,利用Scheme协议打开原生app
      * 2.H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
      * 3.APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
      * 4.APP根据URL跳转到另外一个APP指定页面
      * 5.通过短信息中的url打开原生app
      

    2.URL Scheme基础介绍

    2.1 什么是URL Scheme?

    • android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面

    2.2 URL Scheme协议格式

    String urlStr="http://www.ycbjie.cn:80/yc?id=hello&name=cg";
    //url =            protocol + authority(host + port) + path + query
    //协议protocol=    http
    //域名authority=   www.ycbjie.cn:80
    //页面path=          /yc
    //参数query=       id=hello&name=cg
    //authority =      host + port
    //主机host=        www.ycbjie.cn
    //端口port=        80

    2.3 Scheme链接格式样式

    • 样式:[scheme]://[host]/[path]?[query]

    3.URL Scheme如何使用

    3.1 设置Scheme

    • 在AndroidManifest.xml中对标签增加设置Scheme
    <activity
        android:name=".ui.main.ui.activity.SchemeFirstActivity"
        android:screenOrientation="portrait">
        <!--Android 接收外部跳转过滤器-->
        <!--要想在别的App上能成功调起App,必须添加intent过滤器-->
        <intent-filter>
            <!-- 协议部分配置 ,注意需要跟web配置相同-->
            <!--协议部分,随便设置 yc://ycbjie:8888/from?type=yangchong  -->
            <data android:scheme="yc"
                android:host="ycbjie"
                android:path="/from"
                android:port="8888"/>
    
    
            <!--下面这几行也必须得设置-->
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <action android:name="android.intent.action.VIEW" />
        </intent-filter>
    </activity>

    3.2 获取Scheme跳转的参数,并添加跳转方式

    public class SchemeFirstActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Uri uri = getIntent().getData();
            if (uri != null) {
                //获取指定参数值
                String type = uri.getQueryParameter("type");
                Log.e( "UrlUtils","main: " + type);
    
                if(type.equals("yangchong")){
                    ActivityUtils.startActivity(GuideActivity.class);
                }else if(type.equals("main")){
                    ActivityUtils.startActivity(MainActivity.class);
                }
            }
            finish();
        }
    }

    3.3 调用方式

    • 3.3.1 原生调用
    Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("yc://ycbjie:8888/from?type=yangchong"));
    startActivity(intent);
    • 3.3.2 网页调用
    <a href="yc://ycbjie:8888/from?type=yangchong">打开叮咚app</a>
    • 3.3.3 短信息中调用

    3.4 如何判断一个Scheme是否有效

    PackageManager packageManager = getPackageManager();
    Intent intent = new Intent(Intent.ACTION_VIEW,
            Uri.parse("yc://ycbjie:8888/from?type=yangchong"));
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    boolean isValid = !activities.isEmpty();
    if (isValid) {
        startActivity(intent);
    }

    3.5 Scheme在短信息中注意要点

    • 设置android:scheme="http"或者android:scheme="https"后,点击短信息或者h5页面,发现没有跳到指定的页面,反而打开的是网页链接。

    关于我的博客

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

    什么是 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中对标签增加设置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);
    }

    实际使用中的一些小细节

    当自定义的URL配置在LAUNCHER对应的Activity上时,上述配置就足够了。

    但是当自定义的URL配置在非LAUNCHER对应的Activity时,还需要增加额外几步操作。

    问题一:使用自定义的URL启动Activity时,默认是已FLAG_ACTIVITY_NEW_TASK的方式启动的,所以可能存在URL启动的Activity跟应用已启动的Activity不再同一个堆栈的现象。

    解决方式:这种情况下,需要在manifest中将Activity多配置一个==taskAffinity==属性,约束URL启动的Activity与应用自身的启动的Activity在同一个堆栈中。

    问题二:应用A使用url的方式唤起应用B的Activity时,可能存在应用B的Activity启动了,但是堆栈仍然在后台的现象,即应用B的Activity没有聚焦的问题。

    解决方式:这种情况下,应用B的Activity收到启动的请求后,可以主动将Activity对应的堆栈移动到最前端。

    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
    activityManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_WITH_HOME);

    使用这种方式需要注意的是该api是在Android 3.0(api 11)以后才提供的,现在基本上手机rom版本都是Android4.4以上了,就不太需要关注3.0一下怎么处理了,且使用这个需要在manifest中申请==android.permission.REORDER_TASKS==权限。

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

    展开全文
  • 运用scheme协议唤起外部app

    千次阅读 2019-07-11 20:32:48
    首先,需要指出的是在客户端开发中,scheme是一种页面内跳转协议,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定...
  • 通过scheme协议启动app

    千次阅读 2019-07-10 17:48:45
    以Android端为例,使用scheme协议需要在target页面,也就是需要跳转到的页面添加一个新的action-view类型的intent-filter过滤器。并且这个过滤器和该页面下的其他过滤器是同级别的,也就是说不能使用已经定义的其他...
  • android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化...
  • scheme内部APP页面跳转,在其他手机上都正常跳转,目前就只有在一只手机出现了这个问题,debug这手机,发现到这一步就没有跑下去了,其他手机都是继续运行到另一个activity。 这是只手机的参数。 以下是点击以后报的...
  • Android Scheme协议与应用全解析

    万次阅读 2017-01-26 12:02:24
    URL Scheme 的作用 客户端应用可以向操作系统注册一个 URL Scheme,该 Scheme 用于从浏览器或其他应用中启动本应用。 通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如:书籍封面页,书城...
  • Android 中Scheme协议的使用详解

    千次阅读 2019-09-29 10:19:23
    android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化...
  • Scheme 协议收集总结

    2020-08-31 21:13:49
    文章目录红书跳转Scheme协议 红书跳转Scheme协议 //作品 zm.OpenURL ("xhsdiscover://item/5f111f050000000001000a67") //主页 zm.OpenURL ("xhsdiscover://user/57f70be55e87e712627e6a76")
  • Android采用Scheme协议进行跳转

    千次阅读 2019-12-30 17:07:58
    所谓的Scheme协议具有以下特点: 1.android中的scheme是一种页面内跳转协议。 2.通过定义自己的scheme协议,可以非常方便跳转app中的各个页面; 3.通过scheme协议,服务器可以定制化告诉App跳转到APP内部页面。 ...
  • Scheme协议 Scheme是一种页面跳转协议,和网站通过URL的形式访问一样,APP同样可以通过这种方式进行跳转,它可以很方便的满足我们在一些场景中的需求: 当应用接收到Push,点击通知栏消息跳转到特定页面,比如商品...
  • H5通过URL Scheme协议唤起App

    万次阅读 2020-08-28 10:38:42
    在 h5 页面上唤醒app ,需要用到 scheme协议(由app端提供),但是在微信浏览器里scheme不起作用,因此需要先判断是否为微信浏览器,是微信浏览器的话,提示到浏览器打开,不是的话,再判断是Android端还是iOS端,...
  • Android产品研发(十一)-->应用内跳转Scheme协议

    万次阅读 多人点赞 2016-06-15 23:02:30
    这里的scheme是一种页面内跳转协议,主要用于支持一下几种场景: - 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面; - H5页面点击锚点,根据锚点具体跳转路径App端跳转具体的页面; - App端...
  • scheme = " myappscheme " /> < action android: name = " android.intent.action.VIEW " /> < category android: name = " android.intent.category.DEFAULT " /> < category android: name ...
  • android H5 应用内跳转Scheme协议

    万次阅读 2016-12-30 12:33:19
    那么接下来我们直接开撸,今天要讲解的应用内跳转Scheme协议什么是URL Scheme 概述: android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转ap
  • 一: Scheme协议完成外部链接跳转app指定页面 什么是 URL Scheme?  android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个...
  • android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化...
  • android中的scheme协议

    2020-01-31 21:59:12
    Android中的是Scheme是一种页面的跳转协议,主要用于以下场景: 服务器下发:服务端通过自定义的字段下发至APP,APP通过解析该字段,跳转至相应的界面; H5跳转:通过H5的操作界面,跳转至安卓的原生界面中; ...
  • 最近在一个技术公众号里看见Scheme,由于...如何定义Scheme协议 首先我们来看看URL Scheme 的格式 客户端自定义的 URL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。这
  • android:scheme = "myscheme://" /> intent-filter > activity > 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2.浏览器打开如下html页,即可启动App。 < ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,107
精华内容 17,642
关键字:

scheme协议