Android和Js交互及WebView优化

Android调用js两种方法:

1,通过webview的loadURL方法,如果调用js方法的话,通过webview.loadUrl(“javascript:jsFun()”);如果该方法有参数,直接将参数拼接进去即可,比如webView.loadUrl(“javascript:jsFun(’” + msg + “’)”); 但是这种方法的调用方式,每次都会刷新页面。
2,通过WebView的evaluateJavascript(),这种方法调用js后,可以直接拿到js返回的结果,而且不会每次刷新页面,效率较高,但是版本兼容性较差,只支持Android4.4以上的手机,但现在4.4以下的手机基本很少了,如果用户群体设备基本在Android4.4以上的话,优先推荐这种方法。

Js调用Android的三种方法:
1,通过WebView的addJavascriptInterface()进行映射,被js调用的方法必须加@JavascriptInterface注解
2,通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url,然后解析该URL的协议,如果检测到是预先约定好的交互协议,就调用相应方法,这种方法 js不能接受到Android方法的返回值。
3,通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息,然后解析消息内容,其实这个方法和第二个差不多,最常用的就是通过拦截js的提示框prompt()方法,因为onJSPrompt调用较少,而且可以返回任意类型的值,操作方便灵活,而alert()对话框没有返回值,confirm()对话框只能返回确认和取消两种状态。

Webview优化:
1,如果加载的web页面内部有大量的图片,为保证整个页面的加载速度,可以先不加载图片,等页面finish后在发起图片的网络任务
2,自定义错误页面,根据webviewclient中onReceivedError回调拿到具体的错误,对应展示自己的错误页面
3,Webview开启硬件加速导致页面闪烁:4.0以上的系统我们开启硬件加速后,WebView渲染页面更加快速,拖动也更加顺滑。但有个副作用就是,当WebView视图被整体遮住一块,然后突然恢复时(比如使用SlideMenu将WebView从侧边滑出来时),这个过渡期会出现白块同时界面闪烁。解决这个问题的方法是在过渡期前将WebView的硬件加速临时关闭,过渡期后再开启
4,加载证书错误:webView加载一些别人的url时候,有时候会发生证书认证错误的情况,这时候我们希望能够正常的呈现页面给用户,我们需要忽略证书错误,需要调用WebViewClient类的onReceivedSslError方法,调用handler.proceed()来忽略该证书错误。
5,web音频播放销毁后还有声音:在页面销毁时,首先将webview从页面的容器中移除,然后调用removeallviews方法移除webview内所有的控件,然后调用destroy销毁webview并置空。
6,设置白名单:因为scheme使用有一定危险性,所以可以设置运行访问的白名单(客户端内的WebView都是可以通过客户端的某个schema打开的,而要打开页面的URL很多都并不写在客户端内,而是可以由URL中的参数传递过去的。使用scheme协议打开链接风险已经说明了scheme使用的危险性,那么如何避免这个问题了,设置运行访问的白名单。或者当用户打开外部链接前给用户强烈而明显的提示。)具体设置方法,在onPageStarted回调中,拿到URL和白名单中的URL进行对比
7,后台无法释放js导致手机耗电:如果页面退到后台,而页面中的webview还在执行动画之类的东西,导致资源无法释放而占用CPU,导致耗电特别快,这个时候可以再生命周期中对于webview的生命周期进行绑定,确保页面退到后台时,webview停止抢占CPU。
8,可以在页面开始加载的时候,优先吊起加载的进度,提升用户体验。
9,Webview明文密码优化:设置setSavePassword为false,避免用户允许保存密码后引发的安全隐患。(WebView 默认开启密码保存功能 mWebView.setSavePassword(true),如果该功能未关闭,在用户输入密码时,会弹出提示框,询问用户是否保存密码,如果选择是,密码会被明文保到 /data/data/com.package.name/databases/webview.db 中,这样就有被盗取密码的危险,所以需要通过 WebSettings.setSavePassword(false) 关闭密码保存提醒功能)

你可能感兴趣的:(Android和Js交互及WebView优化)