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);
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,732评论 1 32
  • 链接:https://www.jianshu.com/p/fd61e8f4049e 一、简介 这部分主要介绍下 W...
    柒黍阅读 2,010评论 0 4
  • 我喝了三壶白酒 那棵老树下 又看到了你虚晃的身影
    痞子四阅读 262评论 0 1
  • 很遗憾,oy大神的临摹没有坚持下去 而且也因为很多原因会生出一种就这么凑合凑合的感觉 真的是很抱歉呢! to my...
    lrbingbing阅读 335评论 1 1
  • 算是补了昨天的一次
    池浅笑安然阅读 123评论 0 0

友情链接更多精彩内容