一、Webview常见的一些坑
1.Android API level 16以及之前的版本存在的远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptinterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法
(原理其实很简单,就是通过addJavascriptinterface方法,给webView加入了一个桥接口,而这个桥接口就可以通过调用来操作我们本地的Java接口,就是由于攻击者利用反射机制来调用那些未注册的其它java类,所以导致攻击者可以利用这个漏洞,对客户端进行各种违法的行为)
2.webview在布局文件当中的使用:webview写在其他容器中时
需要注意的是:当你离开的时候,需要销毁webview,这时候你在onDestory方法里面,一定要先把Linearlayout的webview给remove掉,然后再调用webView的removeonviews和webView的ondestory方法才能真正的销毁整个webview,而不会导致内存泄漏问题.
3.webView的Jsbridge
jsbridge作用是什么?其实就是Javascrip构建起的桥,让我们可以本地native端可以调用webjs的代码,同时也可以让远端web调用我们客户端native的代码.
4.webviewClient.onPageFinished -->WebChromeClient.onProgressChanged
.webviewClient.onPageFinished表示的是当你加载这个页面的时候,页面完成的时候会回调这个方法,但是这个方法有很多坑,它会判断你网页内容是否真的加载完毕了,而当前正在加载的网页,如果你产生跳转的时候,这个方法就会被调用无数次,所以说当你的webView需要加载各种各样的网页,并且需要在网页上面完成一些操作的时候,最好调用WebChromeClient.onProgressChanged这个方法.
5.后台耗电
当你的程序开启了WebView加载网页的时候,webView它会自己开启线程,如果你没有很好的将webView销毁的话,这些残余的线程就会一直在后台运行,而导致你的耗电量一直居高不下.所以,我采取在Activity.onDestroy()中直接调用System.exit(0)直接把虚拟机给关闭就不会有任何的webView问题
6.WebView硬件加速导致页面渲染问题
关于硬件加速,其实是从安卓3.0开始的,当我们开启硬件加速之后,webView的渲染页面它就更加加速,拖动起来会更加顺滑,但是有一个副作用,容易出现页面加载白块同时页面闪烁的现象,解决这个问题最好的办法是webView暂时关闭硬件加速.
7.在某些手机上,Webview有视频时,activity销毁后,视频资源没有被销毁,甚至还能听到在后台播放。即便是像刚才那样各种销毁webview也无济于事,解决办法:在onDestory之前修改url为空地址。
二、关于webview 的内存泄漏问题
先来说一下为什么会出现内存泄漏问题?
根本原因就是,我们WebView首先要关联一共Activity,而webView内部执行的操作是在新的线程当中,它时间我们Activity是没有办法确定的,Activity生命周期和新线程的生命周期它是不一样的,所以说导致了webView它会一直持有Activity的引用,不能回收,原理是和我们匿名内部类持有外部类的引用,导致外部类无法回收是一样的,为了避免内存泄漏,我们有两个做法:
1.独立进程,简单粗暴,不过可能涉及到进程间通信
独立进程:就是单独开启一个进程给webView进行操作
2.动态添加WebView,对传入WebView中使用Context使用弱引用,动态添加WebView意思在布局创建个ViewGroup用来放置WebView,Activity创建时add进来,在Activity停止时remove掉