AndroidJS交互原理,如何实现跨平台交互?
- 行业动态
- 2025-03-07
- 2
Android与JS交互原理
1、Android调用JS代码
通过WebView的loadUrl()调用:
这种方式是直接通过WebView控件的loadUrl()
方法来执行JavaScript代码,可以是无参的方法,也可以是有参的方法,在HTML文件中定义了JavaScript函数clickJS()
和clickJSTwo(x)
,在Android代码中可以通过webview.loadUrl("javascript:clickJS()")
来调用无参的clickJS()
函数,通过webview.loadUrl("javascript:clickJSTwo('我调...')
来调用有参的clickJSTwo(x)
函数。
通过WebView的evaluateJavascript()调用:
evaluateJavascript()
方法是在Android 4.4(KitKat)之后引入的,用于执行JavaScript代码并返回结果,它接受两个参数,第一个是要执行的JavaScript代码字符串,第二个是一个回调接口ValueCallback<String>
,用于接收JavaScript代码执行后的结果。webView.evaluateJavascript("document.getElementById('zi').innerHTML", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.d("MainActivity2", "result=" + value); }})
,这段代码会获取网页中id为“zi”的元素的innerHTML属性值,并通过回调接口将结果显示在日志中。
2、JS调用Android代码
通过WebView的addJavascriptInterface()进行对象映射:
这种方式是通过addJavascriptInterface()
方法将Java对象映射到JavaScript对象上,然后在JavaScript中可以直接调用该对象的方法,创建一个Java类JavaScriptInterface
,在其中定义一些方法,如public void clickOnAndroid() {}
,然后通过mWebView.addJavascriptInterface(new JavaScriptInterface(), "demo");
将该对象注入到WebView中,在JavaScript中就可以像调用普通对象的方法一样调用window.demo.clickOnAndroid();
。
通过WebViewClient的shouldOverrideUrlLoading()来拦截Url调用代码:
当JavaScript中执行了类似window.location.href = 'js://webview?arg1=111&arg2=222';
这样的代码时,会触发shouldOverrideUrlLoading()
方法,在该方法中可以获取到URL中的参数,并根据参数执行相应的操作,在上述代码中,可以通过拦截URL获取到参数arg1和arg2的值,然后在Android中进行处理。
通过WebChromeClient的onJsAlert()、onJsConfirm()、onJsPrompt()拦截JS中的对话框alert() / confirm() / prompt():
当JavaScript中调用了alert()
、confirm()
或prompt()
方法时,会分别触发onJsAlert()
、onJsConfirm()
和onJsPrompt()
方法,在这些方法中可以获取到对话框中的消息内容,并进行相应的处理,在onJsAlert()
方法中可以获取到alert()
方法中的提示信息,然后可以选择是否显示原生的对话框或者进行其他操作。
相关问题与解答
1、问题:Android调用JS的loadUrl()
方法和evaluateJavascript()
方法有什么区别?
解答:
loadUrl()
方法是直接加载一个URL地址对应的网页内容,包括JavaScript代码的执行,它会将整个网页重新加载,可能会影响页面的显示和性能,而evaluateJavascript()
方法是在当前网页的上下文中执行JavaScript代码,不会重新加载整个网页,只会执行指定的JavaScript代码并返回结果,对页面的影响较小。
loadUrl()
方法在执行JavaScript代码时,无法直接获取到代码执行后的返回值,除非JavaScript代码本身有相应的机制来返回结果,比如通过修改DOM元素的值等方式,而evaluateJavascript()
方法可以直接获取到JavaScript代码执行后的返回值,通过回调接口ValueCallback<String>
将结果显示出来。
2、问题:JS调用Android的addJavascriptInterface()
方法有什么安全隐患,如何避免?
解答:
addJavascriptInterface()
方法存在安全隐患,主要是因为它可以将Java对象暴露给JavaScript,如果JavaScript代码被反面改动,就有可能利用这个接口访问Java对象的非公开方法或字段,甚至执行任意的Java代码,导致安全破绽。
为了避免这种安全隐患,可以采取以下措施:
尽量避免使用addJavascriptInterface()
方法,如果必须使用,要严格控制暴露给JavaScript的Java对象和方法的权限,只暴露必要的方法和字段。
对输入的JavaScript代码进行严格的验证和过滤,防止反面代码的注入。
定期更新应用程序的安全补丁,及时修复已知的安全破绽。