Android Webview 使用小结

原创 2015年11月19日 11:38:34

采用重载URL的方式实现Java与Js交互


在Android中,常用的Java与Js交互的实现方式是通过函数addJavascriptInterface进行添加在Js中使用的回调代理类。

这种方法虽然方便,但是写出来的js代码并不通用。如果IOS也要实现类似的功能或业务,则IOS要另外写一套Js代码。所以不太推荐。


推荐使用重载URL的方式来实现,因为基本所有的平台都拥有在加载某个URL之前进行一些处理的回调函数。所以这种方式会更加的通用。


响应Javascript中的alert


在Android的WebView控件中,默认对JS的alert函数是没有任何反应的

要想弹出对应的对话框,则需要我们自己进行实现

具体实现代码如下:

webView.getSettings().setJavaScriptEnabled(true);

webView.setWebChromeClient(new WebChromeClient(){

    @Override

    public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

        builder.setTitle("测试alert");

        builder.setMessage(message);

        builder.setPositiveButton("确定", new OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                result.confirm();

            }

        });

        builder.show();

        return true;

    }

});

通过以上代码就可以实现当JS中执行alert时,在Android上以原生的对话框显示出来,当然这里也可以直接Toast。


而这段代码中需要注意的地方有两点:


1. 返回值必须为true。

返回true,则说明已经处理了,不需要交由WebChromeClient来执行。而如果返回的是false,则Webview会继续执行后续的js代码,现象就是,弹出对话框之后,用户还没点确定,后续的js代码已经执行完了.


最后必须调用result.confirm()。


原因在于,如果没有调用此函数,则后续的JS代码将无法继续执行下去。最常见的现象就是,alert对话框只出现一次,第二次再进行alert的时候没有任何反应。其实这里是因为没有调用confirm函数,就相当于在浏览器中alert之后,用户没有点确定。


2. result.confirm()应该放到onClick回调中。


正如前面说的,调用confirm函数,就相当于用户点击了确定按钮。因此,我们要把confirm函数的调用放到Android原生对话框的“确定”按钮的回调函数中进行调用。 之前没理解透,把confirm函数放在了builder.show之后进行调用,结果现象是alert之后,对话框弹出来了,但是后续的js代码没有阻塞,而是继续执行下去了,变得就像是异步了一样,和在chrome中调用js代码的执行逻辑不一致。


不过,如果需求就是要直接执行下去,那也可以,只要理解了就行。


访问证书有问题的SSL网页


对于有证书问题的网页,比如过期、信息不正确、发行机关不被信任等,Webview默认情况下会拒绝访问。而PC端浏览器的处理则是提供用户进行选择是否要继续,在android也是可以实现的。

首先第一种是直接继续,不需要让用户进行选择

@Override

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

    // 默认为调用handler.cancel()方法,因此不要调用super的onReceivedSslError方法

    // super.onReceivedSslError(view, handler, error);

    handler.proceed();

}

这里要注意的是,千万不要调用super的onReceivedSslError方法,因为此方法中已经调用了handler.cancel()。


如果调用了,则会出现第一次无法加载,第二次却能正常访问的现象。


慎重在shouldoverrideurlloading中返回true


当设置了WebviewClient时,在shouldoverrideurlloading中如果不需要对url进行拦截做处理,而是简单的继续加载此网址。


则建议采用返回false的方式而不是loadUrl的方式进行加载网址。


为什么这么建议呢?


因为如果采用loadUrl的方式进行加载,那么对于加载有跳转的网址时,进行webview.goBack就会特别麻烦。


例如加载链接如下:

A->(B->C->D)->E 括号内为跳转


如果采用return false的方式,那么在goBack的时候,可以从第二步直接回到A网页。从E回到A只需要执行两次goBack


而如果采用的是loadUrl,则没办法直接从第二步回到A网页。因为loadUrl把第二步的每个跳转都认为是一个新的网页加载,因此从E回到A需要执行四次goBack


只有当不需要加载网址而是拦截做其他处理,如拦截tel:xxx等特殊url做拨号处理的时候,才应该返回true。


领取(红包,流量,vip账号)福利请到黑客帝国时代 公众号:The_HK


版权声明:本文为博主原创文章,如许转载请在下方加上“搜索微信号 day365game 获取更多信息” 举报

相关文章推荐

Android Webview 使用小结

采用重载URL的方式实现Java与Js交互 在Android中,常用的Java与Js交互的实现方式是通过函数addJavascriptInterface进行添加在Js中使用的回调代理类。 这种方法...

Android中WebView使用小结

1.WebView属性的设置 1.1 设置WebSettings类 WebSettings用来对WebView的配置进行配置和管理,比如是否可以进行文件操作、缓存的设置、页面是否支持放大和缩小、是...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

android webview使用小结

使用webview加载网页 一、webview加载资源类型 1.1  加载web资源       webview.loadUrl("www.baidu.com"); 1.2  加载本地资源 ...

webview使用小结

webview使用小结总结整理下webview的使用用法小结布局文件直接放入webview,同时放入一个progessbar用来显示网页的打开进度。<LinearLayout xmlns:androi...

WebView使用小结

这段时间基于项目需要 在开发中与WebView的接触比较多,前段时间关于HTML5规范尘埃落定的消息出现在各大IT社区头版上,更有人说:HTML5将颠覆原生App开发 虽然我不太认同这一点 但是关于H...

WebView总结

以前一直没有用到WebView. 抽空总结了一下WebView的简单使用. 1. 添加权限 2. 添加JavaScript支持 myWebView.getS...

webView使用方法小结

android 中webview组件常用使用技巧小结

Android学习之 WebView使用小结

这段时间基于项目需要 在开发中与WebView的接触比较多,前段时间关于HTML5规范尘埃落定的消息出现在各大IT社区头版上,更有人说:HTML5将颠覆原生App开发 虽然我不太认同这一点 但是关于H...

Android学习之 WebView使用小结

转载:http://www.2cto.com/kf/201411/354679.html 这段时间基于项目需要 在开发中与WebView的接触比较多,前段时间关于HTML5规范尘埃落定的消息出现在各...

Android学习之 WebView使用小结

这段时间基于项目需要 在开发中与WebView的接触比较多,前段时间关于HTML5规范尘埃落定的消息出现在各大IT社区头版上,更有人说:HTML5将颠覆原生App开发 虽然我不太认同这一点 但是关于H...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)