当前位置:首页 > 行业动态 > 正文

AndroidJS交互原理,如何实现跨平台交互?

Android与JS交互原理通常涉及WebView。在WebView中加载HTML页面,通过JavaScript接口(addJavascriptInterface)让Java代码与JS代码相互调用,实现数据传递和功能交互。

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代码进行严格的验证和过滤,防止反面代码的注入。

定期更新应用程序的安全补丁,及时修复已知的安全破绽。

0