evaluateJavascript
方法来实现。“java,webView.evaluateJavascript("javascript:yourFunction()", null);,
“1、Android调用JS代码的方式
通过WebView的loadUrl()方法
步骤:首先将需要调用的JS代码以.html
格式放到src/main/assets
文件夹里(也可以是远程URL),在Android代码中,先初始化WebView并启用JavaScript支持,然后使用loadUrl()
方法加载JS代码对应的URL。
布局文件中添加WebView控件:<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"/>
。
Java代码中初始化和加载:
WebView webView = findViewById(R.id.webview); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.loadUrl("file:///android_asset/javascript.html");
在JS代码中定义要调用的方法,如function callJS(){alert("Android调用了JS的callJS方法");}
。
在Android中通过按钮点击事件等触发调用JS方法,使用webView.loadUrl("javascript:callJS()");
。
通过WebView的evaluateJavascript()方法
步骤:同样先初始化WebView并启用JavaScript支持,然后使用evaluateJavascript()
方法直接执行JS代码字符串,该方法是异步执行的,需要传入一个ValueCallback<String>
接口来处理返回值(如果有)。
初始化WebView:
WebView webView = findViewById(R.id.webview); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);
调用JS方法:
webView.evaluateJavascript("showAlert('Hello from Android')", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { //处理返回值,此处为空实现 } });
在JS中定义showAlert
方法:function showAlert(message){alert(message);}
。
2、JS调用Android代码的方式
通过WebView的addJavascriptInterface()方法
步骤:先定义一个Java类作为JavaScript接口,在该类中定义一些供JS调用的方法,并使用@JavascriptInterface
注解,然后将该接口实例添加到WebView中,在JS中就可以通过指定的对象名调用这些方法。
定义接口类:
public class WebAppInterface { Context mContext; WebAppInterface(Context context){ mContext = context; } @JavascriptInterface public void showToast(String toast){ Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }
添加接口到WebView:
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
在JS中调用:function callAndroid(){Android.showToast("Hello from JavaScript");}
。
通过WebViewClient的shouldOverrideUrlLoading()方法回调拦截url:在WebViewClient中重写shouldOverrideUrlLoading()
方法,当JS尝试通过window.location
等方式改变URL时会回调该方法,可以在其中进行拦截和处理。
通过WebChromeClient的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt()消息:在WebChromeClient中重写这些方法,可以拦截JS中的相应对话框消息并进行自定义处理。
3、单元表格归纳
方式 | Android调用JS | JS调用Android |
方法 | loadUrl()、evaluateJavascript() | addJavascriptInterface()、shouldOverrideUrlLoading()、onJsAlert()等 |
示例 | webView.loadUrl(“javascript:callJS()”); webView.evaluateJavascript(“showAlert(‘Hello from Android’)”, new ValueCallback | webView.addJavascriptInterface(new WebAppInterface(this), “Android”); webView.setWebViewClient(new WebViewClient(){@Override public boolean shouldOverrideUrlLoading(WebView view, String url){…}}); |
适用场景 | 需要在Android中触发JS代码执行,获取JS函数的返回值等 | 需要在JS中调用Android的功能,如显示Toast等 |
4、相关问题与解答
问题1:如何在Android中调用JS代码并传递参数?
解答:如果是通过loadUrl()
方法调用,可以在JS方法的参数中直接拼接参数值,例如webView.loadUrl("javascript:callJSWithParam('paramValue')");
,如果是通过evaluateJavascript()
方法调用,可以直接在JS代码字符串中拼接参数,如webView.evaluateJavascript("showAlert('Hello from Android, param: ' + paramValue)", new ValueCallback<String>(){...});
。
问题2:JS调用Android代码时,如何确保安全性?
解答:在使用addJavascriptInterface()
方法时,要注意限制接口方法的访问范围,避免暴露敏感的Android功能,可以使用@JavascriptInterface
注解,并在Java代码中对接口方法进行合理的权限控制和安全检查,对于来自不可信源的JS代码,要谨慎处理,避免执行恶意操作。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1617224.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复