Android Schema的妙用

作者: Kandy_JS | 来源:发表于2018-12-12 22:10 被阅读12次

    引用

    1、Android业务组件化之URL Scheme使用
    2、android 通过schema唤起应用指定页面
    3、js 通过schema协议拉起本地app

    定义

    1、android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
    2、schema也是【隐示启动】中的一种,在data属性下的,其他内容查看Android Intent的隐示启动(启动其他APP界面并传递数据)

    使用场景

    • 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
    • H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面,如果没有的话跳转下载等
    • APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
    • APP根据URL跳转到另外一个APP指定页面
    • 各种二维码扫码跳转

    规则

    截图

    schema.png

    实例

    • 需要被打开的activity在manifest清单文件中的写法,注意action和category就行了
            <!--schema-->
            <activity android:name=".module.study.components.activity.schema.ZZZActivity"
                android:screenOrientation="portrait">
                <intent-filter>
                    <!--action.VIEW和category.DEFAULT必须设置-->
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <!--如果需要浏览器支持打开,则category.BROWSABLE-->
                    <category android:name="android.intent.category.BROWSABLE"/>
                    <!--schema的协议类型:随便设置,只要按照统一规则,前后端一致就行-->
                    <data
                        android:scheme="xl"
                        android:host="goods"
                        android:port="8888"
                        android:path="/goodsDetail"
                        />
                </intent-filter>
            </activity>
    
    • 被打开的activity中部分内容,主要是为了看schema或者说uri的结构的
            if(getIntent() != null){
                Uri uri = getIntent().getData();
                //完整路径
                String url = uri.toString();
                //authority
                String authority = uri.getAuthority(); //host:port
                //schema
                String schema = uri.getScheme();
                //host
                String host = uri.getHost();
                //port
                int port = uri.getPort();
                //path
                String path = uri.getPath();
                //query
                String query = uri.getQuery(); //queryParameter=queryString
                //param
                String param = uri.getQueryParameter("goodsId");
                //最后组装
                String finalPath = schema+"://"+host+":"+port+"/"+path+"?"+query;
    
                tv_xxx.setText("由Schema打开的活动画面\n"+
                        "url="+url+"\n"+
                        "finalPath="+finalPath+"\n");
            }
    
    • 如何使用schema去隐示启动这些activity

    方法一:只有:action.VIEW和category.DEFAULT设置的时候

        /**
         * 只有:action.VIEW和category.DEFAULT设置的时候
         * */
        private void openSchema1(){
            Intent it = new Intent();
            it.setAction(Intent.ACTION_VIEW);
            it.setData(Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
            startActivity(it);
        }
    

    方法二:既有:action.VIEW和category.DEFAULT设置的时候,又有:category.BROWSABLE

        /**
         * 既有:action.VIEW和category.DEFAULT设置的时候
         * 又有:category.BROWSABLE
         * */
        private void openSchema2(){
            webView.loadUrl("xl://goods:8888/goodsDetail?goodsId=10011002");
        }
    

    补充:询问有没有activity

    /**
         * 检测某个应用是否安装
         *
         * @param context
         * @param packageName
         * @return
         */
        public static boolean isAppInstalled(Context context, String packageName) {
            try {
                context.getPackageManager().getPackageInfo(packageName, 0);
                return true;
            } catch (PackageManager.NameNotFoundException e) {
                return false;
            }
        }
    
        /**
         * 检测某个应用是否安装
         *
         * @param context
         * @param intent
         * @return
         */
        public static boolean isAppInstalled(Context context, Intent intent){
            List acts = context.getPackageManager().
                    queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
            return (acts.size() > 0);
        }
    
    
        /**
         * 检测某个应用是否安装
         *
         * @param context
         * @param intent
         * @return
         */
        public static boolean isAppInstalled2(Context context, Intent intent){
            return (intent.resolveActivity(context.getPackageManager()) != null);
        }
    

    真的要过年啦~~~~~

    相关文章

      网友评论

        本文标题:Android Schema的妙用

        本文链接:https://www.haomeiwen.com/subject/yxhmhqtx.html