Android基础——WebView详解

875 阅读3分钟

一、 WebView概述

Android WebView在Android平台上是一个特殊的View,它能用来显示网页,这个WebView类可以被用来在app中仅仅显示一张在线的网页,当然还可以用来开发浏览器。

WebView内部实现是采用渲染引擎(WebKit)来展示view的内容,提供网页前进后退、网页放大、缩小、搜索等功能。

WebView是一个基于WebKit引擎、展现Web页面的控件,Android的WebView在低版本和高版本采用了不同的WebKit版本内核。

二、 走过的坑

  1. Android API level 16以及之前的版本存在远程代码执行漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API,利用该漏洞执行任意Java对象的方法。
  2. webview在布局文件中的使用,webview写在其他容器中时,例如写在LinearLayout中,然后通过addView方法动态的将WebView添加到LinearLayout中,需要注意:当离开activity时,需要销毁WebView,才不会导致内存泄漏。
  3. jsbridge 通过JavaScript来构建一个桥,桥的一端是web端,一端是客户端native,作用是为了让本地native端调用远端web JS的代码,同时也可以让远端web调用客户端native的代码。
  4. webviewClient.onPageFinished——>WebChromeClient.onProgressChanged webviewClient.onPageFinished表示页面加载完成时回调该方法,它会判断网页内容是否真的加载完毕,当前正在调用的网址产生跳转时,该方法会调用无数次,所以当webview需要加载各种各样的网页,并且需要在网页上进行操作时,最好是调用WebChromeClient.onProgressChanged方法,这个方法靠谱一些。
  5. 后台耗电,当程序开启了WebView加载网页时,WebView会开启线程,如果没有很好的将WebView销毁,这些残余的线程就会一直在后台运行而导致应用程序耗电量居高不下。
  6. WebView硬件加速导致页面渲染问题,硬件加速是从android3.0 开始的,开启硬件加速后,WebView渲染页面更快,拖动起来更加顺滑,但会导致副作用,容易出现页面加载白块同时界面闪烁的现象,解决该问题的方式是设置WebView关闭硬件加速。

三、 关于WebView的内存泄漏问题

3.1 为什么会引起内存泄漏

WebView会关联一个activity,而WebView内部执行的操作是在新的线程中,它的时间activity是没有办法确定的,WebView会一直持有activity的引用,不能回收。

3.2 解决内存泄漏的2个方法

  1. 独立进程,简单暴力,不过可能设计到进程间的通信。
  2. 动态添加WebView,对传入WebView中使用的Context使用弱引用,动态添加WebView意思在布局创建ViewGroup用来放置WebView,Activity创建时add进来,在Activity停止时把WebView remove掉。再销毁WebView,最后把WebView设置为null。

参考资料
Android WebView 的使用(超详细用法)