手记

Android 混编框架 (2)

这里我对 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


0人推荐
随时随地看视频
慕课网APP