webview学习笔记以及JSBridge

WebView是用来显示网页的控件,使用WebKit渲染引擎加载显示网页。
使用WebView需要申请android.permission.INTERNET 权限。
加载网页只需要调用:loadUrl或者loadData函数即可。
如果你只是简单的打开一个webView显示网页内容,不需要记录数据交互等等,可以不用在app中写WebView,使用以下代码打开浏览器显示:

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(intent);

支持的功能:

  • WebSettings:设置属性,例如支持JavaScript、ZoomControl等等。
  • 注入Java:注入Java代码供JS调用,后面会讲到JSBridge,Java和JavaScript通信。如果显示的HTML有JS代码,则需要设置支持JS:webview.getSettings().setJavaScriptEnabled(true)
  • WebClient:主要是处理页面加载(onPageStarted、onPageFinished等)、请求相关(SSL请求、拦截请求和Url等)、处理错误(onReceivedError等)。
  • WebChromeClient:处理音频、控制台日志、JS对话框(Alert、Confirm、Prompt)、进度条、文件选择、图标标题等。帮助WebView处理各种通知、权限请求事件。

注意的事项:
- Activity的重建销毁都会导致webview的重新加载,例如屏幕旋转、系统设置改变等,需要对WebView当前的状态进行保存。
- 声频支持的话要开启硬件加速

WebView的内存泄漏,主要原因是如果Activity中用到webView,退出Activity即使调用webview.destroy(); webView = null;也没有用,WebView依旧引用Activity,造成内存泄漏。例如该篇文章的描述:http://www.cnblogs.com/kimmy/p/4791657.html
搜索了以下,解决该问题的办法:

不要写WebView在XML中,通过在代码中动态添加WebView,在初始化WebView的时候传入ApplicationContext而不是Activity,因为ApplicationContext是一直存在的。但是这种办法也有问题,如果要在页面上显示什么,是需要Activity这种Context的,ApplicationContext则不行,所以会出错。但是如果你只是简单的浏览而不用交互的话,那就传ApplicationContext好了。

也看到有人使用反射去强制的释放Activity。

接下来就是讲JSBridge,简单的来说就是Java和Javascript通信,互相调用代码。
现在主流的方法就是两种:

  • JSPrompt:网页可以弹出三种类型的弹框,分别是alert(警告框)、confirm(确认框,类似登录的框)、prompt(提示框),在JS中,prompt这种类型的框是很少被用到的,那么可以通过该方法来通知Java,刚刚说到WebChromeClient里面可以接收到js弹出prompt对话框的消息,如果该方法返回true,则表示客户端处理该消息,如果返回false,则会弹出js的prompt对话框。所以只要将该方法返回true,按逻辑处理自己的事情即可。该方法还有一些参数,那么传递给java的参数就可以通过这个方法形参传过来。
  • shouldOverrideUrlLoading:通过webViewClient去拦截url,可以这么理解,如果需要调用java代码时,通过跳转到新的url来触发,每次跳转新的url时,会触发webViewClient的shouldOverrideUrlLoading方法,如果该方法返回true,则客户端已处理,webView不需要处理,如果返回false,则让WebView跳转到新的url。

上面讲的两种方法,主要都是通过url的方式来,那么url就很重要了,需要定义两端通信的schema,只要检测到url的schema是预先定义好的,则说明是需要进行通信,否则按照WebView原有的逻辑来。

那么Javascript调Java的很明显了,那Java调用Javascript呢?更简单了,要么调用loadUrl或者调用evaluateJavascript即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值