为什么要用WebView随着app业务的不断发展,只靠nativecode来构建功能是不现实的。毕竟开发时间会增加,而且iOS和Android需要同时开发两套,而且如果在UI上稍微改动一下,就需要背上包了(虽然Android现在可以进行热更新,但是热更新不是100%有效,懂原理的都懂原理),最后我们会选择使用原生嵌套H5的方式进行开发,这样可以随时更换UI,功能也可以定制扩展。那么,我们就要用到Android的WebView,让我们痛并快乐着的控件。现在的手机定制化程度很高,系统原有的代码或多或少都会被修改和添加。不同手机的WebView会显示不同的效果。可以说是五光十色,所以理解Android开发者的苦衷。接下来,我将详细讲解我在项目中使用WebView的心得。如果您不喜欢它,请不要喷它。刚开始使用的时候,相信大家都是直接把WebView控件添加到布局文件中。当然,我一开始就是这样做的,只是为了简单,不知道会出现什么问题。直接这样加了个WebView,发现没问题,可以显示了,一切正常正常的是的。当你用WebView反复打开一个页面时,你会发现应用程序的内存会不断增加,销毁后不会减少,即使你点击GC也不会减少,所以会有内存泄露。这时候,你会发现这样使用WebView是不正确的,那么如何使用才是最好的呢?也就是在代码中动态添加。首先在布局文件中声明一个父布局>然后在代码中,添加WebView作为它的子ViewWebViewwebView=newWebView(context);webViewLayout.addView(webView);网上很多人说这个context应该用application,我觉得是不对的,如果你的WebView需要弹出一个dialog呢?还有其他不可预知的问题,用当前activity的Context最合适。以上就是如何添加WebView来使用,那么它有哪些属性需要我们在开发中使用呢?webView.loadUrl("www.baidu.com");//WebView加载的网页使用loadUrlWebSettingswebSettings=webView.getSettings();//获取WebView的设置webSettings.setUseWideViewPort(true);//设置这个属性,可以缩放任意规模webSettings.setLoadWithOverviewMode(true);//适配webSettings.setJavaScriptEnabled(true);//支持jswebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//设置缓存模式webSettings.setDomStorageEnabled(true);//启用DOMstorageAPI函数webSettings.setDatabaseEnabled(true);//开启databasestorageAPI函数webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//HTTPS,注意LOLLIPOP上面这个叫webSettings.setAppCacheEnabled(true);//开启ApplicationCaches函数webSettings.setBlockNetworkImage(true);//关闭加载网络图片,可以在开始加载时设置为true,加载完网页后设置为false。以上是WebView中最基本的设置。相信在开发过程中会进行以上设置。webView.setWebChromeClient(newWebChromeClient(){@OverridepublicvoidonProgressChanged(WebViewview,intnewProgress){//加载的进度}@OverridepublicvoidonReceivedTitle(WebViewview,Stringtitle){//获取WebView的标题}@OverridepublicbooleanonJsAlert(WebViewview,Stringurl,Stringmessagesuperfinal){returnresultJsResultresult.onJsAlert(view,url,message,result);//Js弹框}@OverridepublicbooleanonJsConfirm(WebViewview,Stringurl,Stringmessage,finalJsResultresult){AlertDialog.Builderb=newAlertDialog.Builder(IllegalQueryActivity.this);b.setTitle("删除");b.setMessage(消息);b.setPositiveButton(android.R.string.ok,newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){result.confirm();}});b.setNegativeButton(android.R.string.cancel,newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){result.cancel();}});b.create().show();returntrue;}});webView.setWebViewClient(newWebViewClient(){@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){//需要设置在当前WebView中显示网页,以免跳转到默认浏览器显示(view,request,error);//加载错误}@OverridepublicvoidonPageFinished(WebViewview,Stringurl){super.onPageFinished(view,url);//加载完成}});webView.setDownloadListener(newDownLoadListener());//下载监听器privateclassDownLoadListenerimplementsDownloadListener{@OverridepublicvoidonDownloadStart(Stringurl,StringuserAgent,StringcontentDisposition,Stringmimetype,longcontentLength){}}然后WebView与JS的交互webView.addJavascriptInterface(newWebAppInterface(this),"WebJs");publicclassWebAppInterface{ContextmContext;publicWebAppInterface(Contextc){mContext=c;}@JavascriptInterfacepublicvoidmethod(){}}webView.loadUrl("javascript:jsMethod()");//这是WebView调用JS最简单的方法当activity执行生命周期的时候,这里需要注意的是什么时候onDestroy,需要销毁WebView,否则会内存泄露@OverrideprotectedvoidonPause(){super.onPause();if(webView!=null){webView.onPause();}}@OverrideprotectedvoidonResume(){super.onResume();if(webView!=null){webView.onResume();}}@OverrideprotectedvoidonDestroy(){if(webView!=null){webView.clearCache(true);//清除缓存if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.LOLLIPOP){if(webViewLayout!=null){webViewLayout.removeView(webView);}webView.removeAllViews();webView.destroy();}else{webView.removeAllViews();webView.destroy();if(webViewLayout!=null){webViewLayout.removeView(webView);}}webView=null;}}可以看到在上面的onDestroy方法中判断了系统的版本,那是因为我在不同版本测试过,如果低而在5.0版本的WebView中,如果先将WebView从parent中移除,那么WebView将无法销毁,会造成内存泄漏。你可以自己试一下,看看这个说法是否正确。现在仍然遇到的一个问题是WebView嵌套在ScrollView中时,部分机型会出现闪屏问题,WebView单独使用时不会出现。关闭硬件加速后,用户体验并不好,所以暂时还没想到更好的解决办法,所以还是建议不要在ScrollView中嵌套WebView之类的控件。