这里我对 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);
}
网友评论