这里我对 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); } }
我们所有方法都继承这个抽象类,然后需要实现抽象方法 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