继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android 混编框架 (2)

慕村9548890
关注TA
已关注
手记 1260
粉丝 227
获赞 990

这里我对 WebViewClient 进行了封装,目的在于重写 shouldOverrideUrlLoading 方法,对web端发起请求按 schema 进行区分,区分为 http 请求和我们对原生方法的请求,

public class SpWebViewClient extends WebViewClient

我们创建一个 SpWebViewClient 来继承 WebViewClient,也就是 WebViewClient 进行封装。

@Override
    public boolean shouldOverrideUrlLoading(WebView webView, String url) {
      
        Uri parse = Uri.parse(url);//解析请求的 url
        String scheme = parse.getScheme();//获取 url 的sheme 
         //
        if(SpConfig.SCHEME.equals(scheme)){//判断 scheme 是否为 zidea,如果为 zidea 则进行对原生方法请求
            String host = parse.getHost();// 获取 host 也就是原生的方法名
            String param = parse.getQueryParameter(SpConstant.GET_PARAM);//获取参数
            String callback = parse.getQueryParameter(SpConstant.GET_CALLBACK);//获取参数
            
            try {                //这是一个分发方法,根据 host(方法名称、参数、回到)调用进行分发
                spDispatcher(host,param,callback);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
        }        //这里需要控制,只有注册方法才能被调用,没有注册方法不会被调用
        return false;

    }

这个分发类 spDispatcher 负责根据方法名称、参数和回调将这些参数分发给对应处理的原生方法,这里所有原生方法都是 Action。

private void spDispatcher(String method, String params,String jsmethod) throws IllegalAccessException, InstantiationException{        //方法名称获取到获取对应的类,参见下图
        Class type = SpConfig.ActionMapping.mapping(method);        //我们实例化一个对应的 Action
        SpAction action = (SpAction) type.newInstance();      //因为所有 Action 都实现 onAction 这也就是我们调用的具体原生方法,这部分内容稍后解释,大家只需要有一个印象
        action.onAction(mWebView,params,jsmethod);

    }

这里我们注册方法名称对应一个处理的类,这些类都实现 SpAction ,我们通过方法名称可以对应获取类。

public static class ActionMapping{
        private static HashMap<String,Class> mMap;        //注册动作
        static {
            mMap = new HashMap<>();
            mMap.put("forward",SpActionForward.class);
            mMap.put("startActivity", StartActivityAction.class);
            mMap.put("startConversation", StartConversationAction.class);
            mMap.put("updateTitile", UpdateTitileAction.class);
            mMap.put("print",PrintAction.class);
            mMap.put("request", RequestAction.class);
        }        public static Class mapping(String method){            return mMap.get(method);
        }
    }
  1. 我们所有方法都继承这个抽象类,然后需要实现抽象方法 onAction,接受一个 webview 对象、方法参数和 javascript 回调方法。

public abstract class SpAction {    public static Gson mGson;    public abstract void onAction(WebView webView,String params, String jsmethod);
}



作者:zidea
链接:https://www.jianshu.com/p/e12bd2f81536


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP