一、通过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());
2、
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;
}
}
推荐使用方法一!