evaluateJavascript
或
loadUrl("js:function()")
,JS调用安卓需在WebView设置
addJavascriptInterface
并定义接口方法,注意安全
依赖配置
确保AndroidManifest.xml
中添加网络权限(如需网络请求):
<uses-permission android:name="android.permission.INTERNET" />
WebView初始化
在布局文件中添加WebView
:
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />
在Activity中启用JS支持:
WebView webView = findViewById(R.id.webView); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); // 启用JS
添加JavaScript接口
webView.addJavascriptInterface(new Object() { @JavascriptInterface public void showToast(String message) { Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); } }, "Android"); // "Android"是JS端调用的对象名
JS端调用示例
<script> function callAndroid() { Android.showToast('Hello from JS'); } </script> <button onclick="callAndroid()">点击调用安卓</button>
直接执行JS代码
webView.loadUrl("javascript:alert('Hello from Java')");
通过WebChromeClient处理JS对话框
webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { // 拦截JS的alert,可自定义处理 return super.onJsAlert(view, url, message, result); } });
场景 | 实现方式 |
---|---|
传递JSON数据 | 使用loadUrl("javascript:handleData('" + jsonString + "')") 传递序列化数据 |
监听页面加载状态 | 实现WebViewClient 的onPageFinished 方法 |
双向事件回调 | 定义JS与Java的回调函数,通过loadUrl 触发 |
禁用文件访问(防止XSS攻击)
settings.setAllowFileAccess(false); settings.setAllowFileAccessFromFileURLs(false);
处理Android不同API版本差异
onJsConsoleMessage
替代onJsAlert
clearCache
的弹窗提示避免内存泄漏
JavascriptInterface
时调用webView.removeJavascriptInterface("Android")
undefined
原因:
@JavascriptInterface
注解(Android 4.2+必选) 解决方案:
addJavascriptInterface
的第二个参数是否与JS端调用一致 @JavascriptInterface
修饰 setJavaScriptEnabled(true)
)原因:
解决方案:
WebViewClient.onPageFinished
中执行JS调用 webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); view.loadUrl("javascript:myFunction()"); // 确保页面加载完成后调用 } });