当前位置: 移动技术网 > IT编程>移动开发>Android > Android Webview使用小结

Android Webview使用小结

2019年07月24日  | 移动技术网IT编程  | 我要评论

南京悠悠校花门,51网贷网,石像与马龙神撞脸

本文实例为大家分享了android webview使用小结,供大家参考,具体内容如下

#采用重载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代码已经执行完了.

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

3、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。

#onformresubmission

原文链接:http://zlv.me/posts/2015/01/14/08_android-webview使用小结/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网