Android与js交互

Webview篇——统一封装

2019-08-11  本文已影响0人  lvTravler

Android使用WebView混合开发时,就我个人而言一般就写一个WebActivity/WebFragment,将所有的业务逻辑封装在里面,如果不同业务逻辑多了就使用不同的BusinessManager管理起来,但是在特定的情况下还是需要使用多个WebView来展示Web界面的,例如虽然已经封装了WebActivity/WebFragment,但是如果要在LoginActivity/LoginFragment中显示一个用户协议Dialog,用户协议是由Web网页加载显示的,那么就需要另一个WebView来完成,那么为了减少重复代码就需要对WebView进行必要的封装。

WebView中一般有三部分需要进行设置、重写

属性设置一般是通用的,特殊的可单独拿出来作为一个参数,若特殊参数多了可用方法的多态解决

public static void setWebView(@NonNull WebView webView,boolean isSupportJavaScript,boolean isSupportDom) {
        WebSettings settings = webView.getSettings();

        settings.setJavaScriptEnabled(isSupportJavaScript);
        settings.setDomStorageEnabled(isSupportDom);
        //TODO other setting
}

public static void setWebView(@NonNull WebView webView,boolean isSupportJavaScript,boolean isSupportDom) {
        setWebView(webView,isSupportJavaScript,true);//默认支持Dom
}

而对于WebViewClient和WebChromeClient中各回调方法不同业务有不同的处理逻辑,所以可以将各需要的方法通过接口回调拿出来,这样不同的业务就可实现不同的逻辑,看代码:

首先定义一个回调接口:

public interface ProviderCallback {

        void onPageStarted(WebView view, String url, Bitmap favicon);

        void onPageFinished(WebView view, String url);

        void onReceivedTitle(WebView view, String title);

       //TODO other impl
}

然后在相应的方法中回调:

           @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                if (callback != null) {
                    callback.onPageStarted(view, url, favicon);
                }
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                if (callback != null) {
                    callback.onPageFinished(view, url);
                }
            }

           @Override
            public void onReceivedTitle(WebView view, String title) {
                if (callback != null) {
                    callback.onReceivedTitle(view, title);
                }
            }

callback作为参数传入,整体代码结构:

public static void setWebView(@NonNull WebView webView, @Nullable ProviderCallback callback)//,other parameters
{
    //TODO impl
}

经过以上步骤就可实现WebView的统一封装以及不同业务实现不同的处理逻辑,读者有什么不同的观点,可留言大家共同交流!

上一篇下一篇

猜你喜欢

热点阅读