@linux1s1s
2016-12-15T11:37:12.000000Z
字数 2456
阅读 1998
JavaScript
2016-12
对于hybird app
经常会遇到Java-JS
交互的场景,所以这里有必要梳理一下该种场景技术层面如何实现。
目前的实现方案大概有两种,分别是基于WebView
控件和Rhino\Nashorn
引擎,思路大概如下图所示:
通过WebView控件可以实现Java-JS
交互,具体实现简述如下:
只需要通过以下代码即可实现
String jsStr = "javascript:(function(){callname(parameter)})()"
webView.loadUrl(jsStr);
需要注意的地方是parameter
需要做转义处理,部分需要转义是字符如下
public static String escapeString(String str){
if(TextUtils.isEmpty(str)){
return "";
}
char[] chars = str.toCharArray();
StringBuilder builder = new StringBuilder();
for(char c : chars){
switch(c){
case '\b' :
builder.append("\\b");
break;
case '\t' :
builder.append("\\t");
break;
case '\n' :
builder.append("\\n");
break;
case '\f' :
builder.append("\\f");
break;
case '\r' :
builder.append("\\r");
break;
case '\\' :
builder.append("\\\\");
break;
case '\'':
builder.append("\\\'");
break;
case '\"':
builder.append("\\\"");
break;
default:
builder.append(c);
}
}
return builder.toString();
}
JS与Java通信有两种方式,分别是webView本身提供的注册接口
以及通过Http Scheme
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
@Override
public void addJavascriptInterface(WebView webview) {
webview.addJavascriptInterface(new TestJavaScriptInterface(), "name");
}
final public class TestJavaScriptInterface {
public TestJavaScriptInterface() {
}
@JavascriptInterface
public void xxxx(String str) {
//TODO
}
}
这种方式是间接的通信方法,通常H5和Native约定scheme,H5发起该schme,Native通过拦截该scheme,然后Native再做约定的处理,从而实现JS和Java通信。
<div class="container" style="margin: 50px; padding: 20px;">
<button type="button" class="btn btn-danger btn-xs" style="width: 200px; height: 50px;" onclick="testLine();">测试协议</button>
</div>
<script>
function testLine() {
alert(1);
location.href = 'xxxx://host/path?parameters...';
}
</script>
@Override
public boolean shouldOverrideUrlLoading(final WebView view, String url) {
Uri uri = Uri.parse(url);
String scheme = uri.getScheme();
if ("xxx".equals(scheme)){
//TODO
}
}
Rhino,下载源码解压以后将js.jar
文件引入到工程下,接下来我们测试一下Java和JS如何通信。
//Java 调用 JS
org.mozilla.javascript.Context context = org.mozilla.javascript.Context.enter();
context.setOptimizationLevel(-1);
Scriptable s = context.initStandardObjects();
String js = "100*200/200";
Object result = context.evaluateString(s,js, null, 0, null);
Log.i("mutex", "JS result is: " + result);
看一下验证结果
本地写JS文件,其中实现Java接口如下:
var jsStr={run:function(){print("\nRunning Now...");}}
var r = new java.lang.Runnable(jsStr);
var t = new java.lang.Thread(r);
t.start();
然后通过console控制台运行shell命令,在运行命令前,请将js.ja
r放入以下目录
C:\Program Files\Java\jre1.8.0_111\lib\ext
运行结果
参考博文:
Rhino -- 基于java的javascript实现
深入浅出Rhino:Java与JS互操作
Java 8 Nashorn 引擎