Android Schema的妙用

引用

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完整路径:schema://host:port/path/query

    • authority --> host:port
    • query --> queryParameter=queryString
  • 举例:xl://goods:8888/goodsDetail?goodsId=10011002

    • schema=xl
    • host=goods
    • port=8888 (必须是int型哦)
    • authority=goods:8888
    • path=/goodsDetail
    • query=(此处方便看清,稍微隔开一点)goodsId=10011002

截图

Android Schema的妙用_第1张图片

schema.png

实例

  • 需要被打开的activity在manifest清单文件中的写法,注意action和category就行了

 

        
        
            
                
                
                
                
                
                
                
            
        
  • 被打开的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);
    }



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

你可能感兴趣的:(系统内容)