WebView (一):简述
WebView 一简述WebView 二加速内核版本在Android 4.4以下(不包含4.4)系统WebView底层实现是采用WebKit内核在Android 4.4及其以上Google 采用了chromium作为系统WebView的底层内核支持注意点Android SDK 16 以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用 WebView. addJavascriptInterface方法,远程攻击者可通过使用 Java ReflectionAPI利用该漏洞执行任意Java对象的方法。Cordova利用onJsPrompt() 替代了addJavaScriptInterface()。WebViewClient.onPageFinished()Android4.4的手机上onPageFinished()回调会多调用一次当前正在加载的网页产生跳转的时候这个方法可能会被多次调用。可以使用WebChromeClient.onProgressChanged方法。Webview在Android 4.0上已经默认开启硬件加速硬件加速导致页面渲染问题需要关闭硬件加速。内存泄漏。内存泄露原因Android5.1 以上系统原因onDetachedFromWindow增加了isDestroyed判断如果执行了destroy()就会导致无法反注册。5.1以下没有判断因此没有问题。布局文件中直接使用在XML文件中创建WebView,会把Activity作为Context传给WebView而不是Application Context。所以在finishingActivity的时候WebView任然持有Activity引用导致Activity无法被回收。内存泄露解决方案1使用动态床架WebView不使用布局文件声明方式步骤代码动态创建WebView弱引用传入上下文在布局文件中用容器类布局比如FrameLayout作为WebView的容器在Activity中主动把WebView添加到容器中。在OnDestory()中移除、销毁WebView。OverrideprotectedvoidonDestroy(){super.onDestroy();if(mWebView!null){ViewParentparentmWebView.getParent();if(parent!null){((ViewGroup)parent).removeView(mWebView);}mWebView.removeAllViews();mWebView.destroy();mWebViewnull;}}内存泄露解决方案2为加载WebView的界面开启新进程在该页面退出之后关闭这个进程,使用System.exit(0);直接退出虚拟机Android为每一个进程创建一个虚拟机的。需要考虑多进程通信问题通过AIDL与主进程进行通信。QQ貌似使用的这种方式。步骤在manifest文件中给webView所在的activity加上android:process属性在webView所在的activity的onDestroy()方法中System.exit(0);