WebView引见
WebView是Android平台中用于显示网页内容的控件,基于Chromium名目(并非完整版的Chrome阅读器,不包括Chrome中的一切性能)。WebView经常使用WebKit引擎来渲染网页,可以很好地兼容Web规范,可以显示HTML、CSS和JavaScript等外容,还可以用于灵活加载网页内容,并与网页启动交互,如点击链接、输入文本等。
WebView在Android运行开发中十分有用,在须要展现网页内容或许与网页交互的场景中。例如,在微信或微博等运行程序中,WebView罕用于关上运行程序内的共享超链接。经过WebView在运行中间接展现网页内容,提供了更为丰盛的用户体验。
WebView的生命周期:
为了正确治理WebView的生命周期,应追随Activity的生命周期方法来调用WebView的生命周期方法。例如,当Activity进入onResume形态时,应调用WebView的onResume方法;当Activity进入onPause形态时,应调用WebView的onPause方法;当Activity被销毁时,应确保WebView也被正确销毁。
@Overrideprotected void onResume() {super.onResume();//复原webview的形态(不靠谱)webView.resumeTimers();//激活webView的形态,能反常加载网页webView.onResume();}@Overrideprotected void onPause() {super.onPause();//当页面被失去焦点被切换到后盾无法见形态,须要口头onPause//经过onPause举措通知内核暂停一切的举措,比如DOM的解析、plugin的口头、JavaScript口头。webView.onPause();//当运行程序(存在webview)被切换到后盾时,这个方法不只仅针对的webview而是全局的全运行程序的webview//它会暂停一切webview的layout,parsing,javascripttimer。降落CPU功耗。(不靠谱)webView.pauseTimers();}@Overrideprotected void onDestroy() { super.onDestroy(); //在封锁了Activity时,假设Webview的音乐或视频,还在播放。就必定销毁Webview //但是留意:webview调用destory时,webview仍绑定在Activity上 //这是由于自定义webview构建时传入了该Activity的context对象 //因此须要先从父容器中移除webview,而后再销毁webview: ViewGroup parent = findViewById(R.id.container); parent.removeView(webView); webView.destroy();}
WebView经常使用
增加网络权限
WebView webView = (WebView) findViewById(R.id.webview);
//申明WebSettings子类WebSettings webSettings = webView.getSettings();//假设访问的页面中要与Javascript交互,则webview必定设置支持JavascriptwebSettings.setJavaScriptEnabled(true);//支持插件webSettings.setPluginsEnabled(true);//设置自顺应屏幕,两者合用webSettings.setUseWideViewPort(true); //将图片调整到适宜webview的大小webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小//缩放操作webSettings.setSupportZoom(true); //支持缩放,默以为true。是上方那个的前提。webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView无法缩放webSettings.setDisplayZoomControls(false); //暗藏原生的缩放控件//其余细节操作webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //封锁webview中缓存webSettings.setAllowFileAccess(true); //设置可以访问文件webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持经过JS关上新窗口webSettings.setLoadsImagesAutomatically(true); //支持智能加载图片webSettings.setDefaultTextEncodingName("utf-8");//设置编码格局
webView.loadUrl("https://www.baidu.com"); // 加载远程网页
加载本地的HTML文件:
webView.loadUrl("file:///android_asset/index.html"); // 加载本地HTML文件
加载HTML数据:
String goods_content="<p>我的第一个段落。</p>";webView.loadDataWithBaseURL(null, WebUtil.getHtmlData(goods_content), "text/html", "utf-8", null);public static String getHtmlData(String bodyHTML) { String head = "<head>" +"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"> " +"<style>div,p,img{max-width: 100%; width: 100% !important; height: auto !important;}" +"body {" +"margin-right:8px;" +//限定网页中的文字左边距为15px(可依据实践须要启动行管屏幕适配操作)"margin-left:8px;" +//限定网页中的文字左边距为15px(可依据实践须要启动行管屏幕适配操作)"margin-top:8px;" +//限定网页中的文字上边距为15px(可依据实践须要启动行管屏幕适配操作)"font-size:16px;" +//限定网页中文字的大小为40px,请务必依据各种屏幕分辨率启动适配更改"word-wrap:break-word;" +//准许智能换行(汉字网页应该不须要这一属性,这个用来强迫英文单词换行,相似于word/wps中的西文换行)"}" +"p { margin: 0; }" +"</style>" +"</head>"; return "<html>" + head + "<body>" + bodyHTML + "</body><ml>";}
webView.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}});
经过WebViewClient或WebChromeClient类来处置网页加载环节中的一些事情,比如页面开局加载、页面加载成功、出现错误等。
WebViewClient webViewClient = new WebViewClient() {/*** shouldOverrideUrlLoading* <p>* 当加载的网页须要重定向的时刻就会回调这个函数告知咱们运行程序能否须要接收控制网页加载,假设运行程序接收,*并且return true象征着主程序接收网页加载,假设前往false让webview自己处置。* </p>* 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param url*行将要被加载的url* @return true 运行程序要自己处置这个url, 前往false则不处置。 注:"post"恳求模式不会调用这个回调函数*/ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {if (Uri.parse(url).getHost().equals("www.baidu.com")) {Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);return true;}return false; }/*** onPageStarted 当内核开局加载访问的url时,会通知运行程序,对每个main frame* 这个函数只会被调用一次性,页面蕴含iframe或许framesets 不会另内查用一次性onPageStarted,* 当网页内内嵌的frame 出现扭转时也不会调用onPageStarted。** 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param url*行将要被加载的url* @param favicon*假设这个favicon曾经存储在本地数据库中,则会前往这个网页的favicon,否则前往为null。*/ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) {// TODO Auto-generated method stubsuper.onPageStarted(view, url, favicon);Log.i(TAG, "onPageStarted:页面开局加载"); }/*** onPageFinished 当内核加载完页面时会通知咱们的运行程序,这个函数只要在main* frame状况下才会被调用,当调用这个函数之后,渲染的图片不会被降级,假设须要取得新图片的通知可以经常使用@link* WebView.PictureListener#onNewPicture。 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param url*行将要被加载的url*/ @Override public void onPageFinished(WebView view, String url) {// TODO Auto-generated method stubsuper.onPageFinished(view, url);Log.i(TAG, "onPageStarted:页面加载完结"); }/*** onLoadResource 通知运行程序WebView行将加载url 制订的资源** 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param url*行将加载的url 资源*/ @Override public void onLoadResource(WebView view, String url) {// TODO Auto-generated method stubsuper.onLoadResource(view, url);Log.i(TAG, "onLoadResource:加载资源指定的网址"); }/*** shouldInterceptRequest* 通知运行程序内核行将加载url制订的资源,运行程序可以前往本地的资源提供应内核,若本地处置前往数据,内核不从网络上失掉数据。** 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param url*raw url 制订的资源* @return 前往WebResourceResponse蕴含数据对象,或许前往null*/ @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) {// TODO Auto-generated method stubLog.i(TAG, "shouldInterceptRequest");return super.shouldInterceptRequest(view, url); }/*** onReceivedError* <p>* 当阅读器访问制订的网址出现错误时会通知咱们运行程序 参数说明:* </p>** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param errorCode*错误号可以在WebViewClient.ERROR_* 外面找到对应的错误称号。* @param description*形容错误的信息* @param failingUrl*访问失败的url,留意并不必定是咱们主url*/ @Override public void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {// TODO Auto-generated method stubsuper.onReceivedError(view, errorCode, description, failingUrl);view.loadUrl("file:///android_asset/error.html");Log.i(TAG, "onReceivedError"); }/*** 假设阅读器须要从新发送POST恳求,可以经过这个机遇来处置。自动是不从新发送数据。 参数说明** @param view*接纳WebViewClient的webview* @param dontResend*阅读器不须要从新发送的参数* @param resend*阅读器须要从新发送的参数*/ @Override public void onFormResubmission(WebView view, Message dontResend,Message resend) {// TODO Auto-generated method stubsuper.onFormResubmission(view, dontResend, resend);Log.i(TAG, "onFormResubmission"); }/*** doUpdateVisitedHistory* 通知运行程序可以将的url存储在数据库中,象征着的访问url曾经失效并被记载在内核当中。这个函数在网页加载环节中只会被调用一次性。* 留意网页行进前进并不会回调这个函数。** 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param url*正在访问的url* @param isReload*假设是true 这个是正在被reload的url*/ @Override public void doUpdateVisitedHistory(WebView view, String url,boolean isReload) {// TODO Auto-generated method stubsuper.doUpdateVisitedHistory(view, url, isReload);Log.i(TAG, "doUpdateVisitedHistory"); }/*** 当网页加载资源环节中发现SSL错误解调用此方法。咱们运行程序必定做出照应,是敞开恳求handler.cancel(),还是继续恳求handler.* proceed();内核的自动行为是handler.cancel();** 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param handler*处置用户恳求的对象。* @param error*SSL错误对象**/ @Override public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {// view.loadUrl("file:///android_asset/error.html");// TODO Auto-generated method stubsuper.onReceivedSslError(view, handler, error);Log.i(TAG, "onReceivedSslError"); }/*** onReceivedHttpAuthRequest 通知运行程序WebView接纳到了一个Http* auth的恳求,运行程序可以经常使用supplied 设置webview的照应恳求。自动行为是cancel 本次恳求。*** 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param handler*用来照应WebView恳求的对象* @param host*恳求认证的host* @param realm*仔细恳求所在的域*/ @Override public void onReceivedHttpAuthRequest(WebView view,HttpAuthHandler handler, String host, String realm) {// TODO Auto-generated method stubsuper.onReceivedHttpAuthRequest(view, handler, host, realm);Log.i(TAG, "onReceivedHttpAuthRequest"); }/*** shouldOverrideKeyEvent* 提供运行程序同步一个处置按键事情的时机,菜单快捷键须要被过滤掉。假设前往true,webview不处置该事情,假设前往false,* webview会不时处置这个事情,因此在view 链上没有一个父类可以照应到这个事情。自动行为是return false;*** 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param event*键盘事情名* @return 假设前往true,运行程序处置该期间,前往false 交由webview处置。*/ @Override public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {Log.i(TAG, "shouldOverrideKeyEvent");// TODO Auto-generated method stubreturn super.shouldOverrideKeyEvent(view, event); }/*** 通知运行程序webview 要被scale。运行程序可以处置改事情,比如调整适配屏幕。*/ @Override public void onScaleChanged(WebView view, float oldScale, float newScale) {// TODO Auto-generated method stubsuper.onScaleChanged(view, oldScale, newScale);Log.i(TAG, "onScaleChanged"); }/*** onReceivedLoginRequest 通知运行程序有个智能登录的帐号环节** 参数说明:** @param view*恳求登陆的webview* @param realm*账户的域名,用来查找账户。* @param account*一个可选的账户,假设是null 须要和本地的账户启动check, 假设是一个可用的账户,则提供登录。* @param args*验证制订参数的登录用户*/ @Override public void onReceivedLoginRequest(WebView view, String realm,String account, String args) {// TODO Auto-generated method stubsuper.onReceivedLoginRequest(view, realm, account, args);Log.i(TAG, "onReceivedLoginRequest");}});
WebChromeClient辅佐WebVlew处置Javascrlpt的对话框,网站图标,网站tltle,加载进展等。
webView.setWebChromeClient(new WebChromeClient() { /*** onProgressChanged 通知运行程序网页加载的进展。** 参数说明:** @param view*接纳WebChromeClient的的webview实例* @param newProgress*webview接受的进展*/ @Override public void onProgressChanged(WebView view, int newProgress) {// TODO Auto-generated method stubsuper.onProgressChanged(view, newProgress);if (newProgress <= 100) {Log.i(TAG, newProgress + "===onProgressChanged===");} }/*** 当document 的title变动时,会通知运行程序*** 参数说明:** @param view*接纳WebViewClient的webview实例* @param title*document新的title*/ @Override public void onReceivedTitle(WebView view, String title) {// TODO Auto-generated method stubsuper.onReceivedTitle(view, title);Message message = new Message();message.what = 100;message.obj = title;handler.sendMessage(message);}/*** 页面有个新的favicon时刻,会回调这个函数。 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param icon*页面的favicon 注:很多期间不会跳转到此回调函数,由于很多网站设置了icon,没有设置favicon,*/ @Override public void onReceivedIcon(WebView view, Bitmap icon) {// TODO Auto-generated method stubsuper.onReceivedIcon(view, icon);Message message = new Message();message.what = 200;message.obj = icon;handler.sendMessage(message); }/*** 通知运行程序 apple-touch-icon的 url** 参数说明:** @param view*接纳WebViewClient的那个实例,前面看到webView.setWebViewClient(new*MyAndroidWebViewClient()),即是这个webview。* @param url*apple-touch-icon 的服务端地址* @param precomposed*假设precomposed 是true 则touch-icon是预先创立的**Tips**假设运行程序须要这个icon的话, 可以经过这个url失掉失掉 icon。*/ @Override public void onReceivedTouchIconUrl(WebView view, String url,boolean precomposed) {// TODO Auto-generated method stubsuper.onReceivedTouchIconUrl(view, url, precomposed);Log.i(TAG, "====onReceivedTouchIconUrl===="); }/*** webview恳求失掉focus,出现这个关键是webview不是前台形态,是后盾webview。*/ @Override public void onRequestFocus(WebView view) {// TODO Auto-generated method stubsuper.onRequestFocus(view);Log.i(TAG, "====onRequestFocus===="); }/*** 笼罩自动的window.alert展现界面,*/ @Override public boolean onJsAlert(final WebView view, String url, String message,JsResult result) {final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());builder.setTitle("对话框").setMessage(message).setPositiveButton("确定", null);builder.setOnKeyListener(new OnKeyListener() {public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {Log.v("onJsAlert", "keyCode==" + keyCode + "event=" + event);return true;}});// 制止照应按back键的事情builder.setCancelable(false);AlertDialog dialog = builder.create();dialog.show();result.confirm();// 由于没有绑定事情,须要强行confirm,否则页面会变黑显示不了内容。return true;// return super.onJsAlert(view, url, message, result); }/*** 笼罩自动的window.confirm展现界面,*/ @Override public boolean onJsConfirm(final WebView view, String url, String message,final JsResult result) {final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());builder.setTitle("对话框").setMessage(message).setPositiveButton("确定", new OnClickListener() {public void onClick(DialogInterface dialog, int which) {result.confirm();}}).setNeutralButton("敞开", new OnClickListener() {public void onClick(DialogInterface dialog, int which) {result.cancel();}});builder.setOnCancelListener(new OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {result.cancel();}});// 屏蔽keycode等于84之类的按键,防止按键后造成对话框信息而页面无法再弹出对话框的疑问builder.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {Log.v("onJsConfirm", "keyCode==" + keyCode + "event=" + event);return true;}});// 制止照应按back键的事情// builder.setCancelable(false);AlertDialog dialog = builder.create();dialog.show();return true; }/*** 笼罩自动的window.prompt展现界面,*/ @Override public boolean onJsPrompt(WebView view, String url, String message,String defaultValue, final JsPromptResult result) {final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());builder.setTitle("对话框").setMessage(message);final EditText et = new EditText(view.getContext());et.setSingleLine();et.setText(defaultValue);builder.setView(et).setPositiveButton("确定", new OnClickListener() {public void onClick(DialogInterface dialog, int which) {result.confirm(et.getText().toString());}}).setNeutralButton("敞开", new OnClickListener() {public void onClick(DialogInterface dialog, int which) {result.cancel();}});// 屏蔽keycode等于84之类的按键,防止按键后造成对话框信息而页面无法再弹出对话框的疑问builder.setOnKeyListener(new OnKeyListener() {public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {Log.v("onJsPrompt", "keyCode==" + keyCode + "event=" + event);return true;}});// 制止照应按back键的事情// builder.setCancelable(false);AlertDialog dialog = builder.create();dialog.show();return true;// return super.onJsPrompt(view, url, message, defaultValue,// result); }});
编写html文件,放到assets文件外面:
<!DOCTYPE html><html> <head><meta charset="utf-8"> </head> <body><div>function say(value){</br>callJS(value);</br>}</div> </body><script>function callJS(value){alert(value);return value;} </script></html>
Android调用js:
public class MainActivity extends AppCompatActivity {private WebView webview;private TextView tvAndroid;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);webview = (WebView) findViewById(R.id.webview);tvAndroid = (TextView) findViewById(R.id.tv_android);tvAndroid.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//Android调用js方法//Android 4.4以下经常使用loadUrl,Android 4.4以上evaluateJavascriptif (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {webview.loadUrl("javascript:callJS('aaa')");} else {webview.evaluateJavascript("javascript:callJS('aaa')", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {//此处为 js 前往的结果Toast.makeText(MainActivity.this,value,Toast.LENGTH_SHORT).show();}});}}});initWebView();}public void initWebView() {//启用JS脚本webview.getSettings().setJavaScriptEnabled(true);// 设置准许JS弹窗webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//加载网页webview.loadUrl("file:///android_asset/index.html");// 由于设置了弹窗测验调用结果,所以须要支持js对话框// webview只是载体,内容的渲染须要经常使用webviewChromClient类去成功// 经过设置WebChromeClient对象处置JavaScript的对话框//设置照应js 的Alert()函数webview.setWebChromeClient(new WebChromeClient(){@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult jsResult) {new AlertDialog.Builder(view.getContext()).setMessage(message).setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {jsResult.confirm();}}).setCancelable(false).create().show();return true;}});//笼罩WebView自动经常使用第三方或系统自动阅读器关上网页的行为,使网页用WebView关上webview.setWebViewClient(new WebViewClient() {//overridepublic void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {handler.proceed("admin", "sunlight");int d = Log.d("MyWebViewClient", "onReceivedHttpAuthRequest");}@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String uri) {// TODO Auto-generated method stub//前往值是true的时刻控制去WebView关上,为false调用系统阅读器或第三方阅读器view.loadUrl(uri);return true;}});}}
「留意」js代码调用必定要在onPageFinished()回调之后能力调用,否则不会调用。
js调用Android方法: 经过WebView的addJavascriptInterface()启动对象映射
<!DOCTYPE html><html> <head><meta charset="utf-8"> </head> <body><button哈哈哈')">js调用Android方法</button> </body></html>
public class MainActivity2 extends AppCompatActivity {private WebView webview;private TextView tvAndroid;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);webview = (WebView) findViewById(R.id.webview);tvAndroid = (TextView) findViewById(R.id.tv_android);tvAndroid.setText("//承袭自Object类,别名是aa,即在html可以间接用aa.showToast(\"哈哈哈\")来调用android方法\n" +"public class MyObject extends Object {\n" +"@JavascriptInterface\n" +"public void showToast(String name){\n" +"Toast.makeText(MainActivity2.this, \"您好!\"+name, Toast.LENGTH_SHORT).show();\n" +"}\n" +"}");initWebView();}public void initWebView() {// 设置与Js交互的权限webview.getSettings().setJavaScriptEnabled(true);//将java对象泄露给JavaScript脚本//参数1:java对象,外面定义了java方法//参数2:Java对象在js里的对象名,可以看作第一个参数的别名,可以随意取,即在html可以间接用aa.showToast("哈哈哈")来调用android方法webview.addJavascriptInterface(new MyObject(), "aa");//AndroidtoJS类对象映射到js的test对象//加载网页webview.loadUrl("file:///android_asset/index2.html");}//承袭自Object类,别名是aa,即在html可以间接用aa.showToast("哈哈哈")来调用android方法public class MyObject extends Object {// 定义JS须要调用的方法// 被JS调用的方法必定参与@JavascriptInterface注解@JavascriptInterfacepublic void showToast(String name){Toast.makeText(MainActivity2.this, "您好!"+name, Toast.LENGTH_SHORT).show();}}}
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {webView.goBack();return true;}return super.onKeyDown(keyCode, event);}
WebSettings webSettings = webView.getSettings();//优先经常使用缓存webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//只在缓存中读取webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);/不经常使用缓存webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
//肃清网页访问留下的缓存,由于内核缓存是全局的因此这个方法不只仅针对webview而是针对整个运行程序.webview.clearCache(true);//肃清webview访问的历史记载,只会webview访问历史记载里的一切记载除了访问记载.webview.clearHistory ();//这个api仅仅肃清智能成功填充的表复数据,并不会肃清WebView存储到本地的数据。webview.clearFormData ();
留意
WebView在经常使用环节中存在一些经常出现疑问「性能疑问」WebView加载H5页面时,由于JS解析环节复杂、前端页面触及较多的JS代码文件,以及Android机型碎片化造成的手机配件性能差异,或许会造成页面加载速度较慢。每次加载H5页面都会发生较多的网络恳求,包括HTML的主URL恳求以及HTML援用的外部JS、CSS、字体文件、图片文件等,会消耗必定的流量和期间。
「内存治理疑问」WebView是依靠于Activity的,而Activity的生命周期和WebView启动的线程的生命周期或许不分歧,或许造成WebView不时持有对Activity的援用而无法监禁,从而引发内存走漏疑问。WebView经常使用不当,或许会造成运行程序在运转环节中占用少量内存,甚至引发运行解体。
「安保破绽」WebView中或许存在一些安保破绽,如远程代码口头破绽、明码明文存储破绽和域控制不严厉破绽等。或许造成攻打者应用WebView口头恣意Java对象的方法,窃取用户信息,甚至控制用户设施。
「兼容性疑问」不同版本的Android系统或不同品牌的手机或许存在WebView兼容性疑问。例如,一些机型或许不支持WebGL,造成局部网页内容无法反常显示。WebView在加载某些特定格局的网页或口头某些特定操作时也或许出现兼容性疑问。