一、通过WebView的addJavascriptInterface()进行对象映射
1、将JS代码javascript.html格式放到src/main/assets文件夹里
javascript.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JavaScript</title> <script> function callAndroid(){ native.post("native://back"); } </script> </head> <!-- 点击按钮则调用callAndroid()方法 --> <body> <button type="button" id="button1" onclick="callAndroid()">点击调用Android代码</button> </body> </html>
2、在Android里通过WebView设置调用JS代码
webSettings.setJavaScriptEnabled(true);
//AndroidtoJS类对象映射到js的native对象
wvWebview.addJavascriptInterface(newWebJumpUtils(this), "native");
wvWebview.loadUrl("file:///android_asset/javascript.html");
/** * WebView跳转功能 */ public class WebJumpUtils { private Activity activity; public WebJumpUtils(Activity activity) { this.activity = activity; } @JavascriptInterface public void post(String message) { //message == "native://back" 进行你的处理 MLog.e("WebJumpUtils", message); switch (message) { case "native://back"://回退 if (activity != null && !activity.isFinishing())//避免IllegalArgumentException { activity.finish(); } break; case "native://login"://登录 startAct(AlreadyRegisterActivity.class); break; } } }
二、通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
1、wvWebview.setWebViewClient(new MyWebViewClient());
2、back需要前后台约定好
private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.contains("back")) { handlerH.sendEmptyMessage(2); return true; } try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } catch (Exception e) { } return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { //接受证书 if(error.getPrimaryError() == android.net.http.SslError.SSL_INVALID ){// 校验过程遇到了bug handler.proceed(); }else{ handler.cancel(); } super.onReceivedSslError(view, handler, error); } }
三、通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息
1、wvWebview.setWebChromeClient(new MyWebChromeClient());
private class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, final String url, final String message, JsResult result) { Log.d("main", "onJsAlert:" + message); runOnUiThread(new Runnable() { @Override public void run() { new AlertDialog.Builder(WebViewActivity.this) .setTitle("提示") .setMessage(message) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .show(); } }); result.confirm();//这里必须调用,否则页面会阻塞造成假死 return true; } }