在开发过程中有时会遇到这种情况,需要调用js的一些方法,又不需要显示h5界面。比如,在你开发的产品中,PC、h5,移动端(Android、IOS)都需要使用到同一个算法,而且这个算法又非常的复杂,若每个端都写一边,不仅浪费时间,而且如果算法涉及到复杂的数字计算,那么就可能会导致每个端写出来的算法结果不一致。
所以这个时候,使用js编写一个通用算法是比较理想的一个解决方法,因为pc、h5、Android、ios都可以直接调用js代码,并执行计算结果。
Android调用本地js步骤:
步骤一:
在assets下添加你需要执行的js代码
步骤二:
Android代码
WebView mWebView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mWebView == null) {
initWebView();
}
getPrxResult();
}
/**
* 调用js方法
*/
private void getPrxResult(){
String e ="";
String t ="";
String url2 = "javascript:jclqBonusRange(" + e + "," + t + ")"; //调用js方法
mWebView.loadUrl(url2);
}
/**
* 初始化webview
*/
protected void initWebView() {
mWebView = new WebView(this);
mWebView.getSettings().setDefaultTextEncodingName("utf-8");
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JsToJava(), "stub"); //JsToJava是内部类,代码在后面。stub是接口名字。
mWebView.loadUrl("file:///android_asset/bonus_helper.html"); //js文件路径
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
// String urlinit = "javascript:footballHelper.Es.jclq.setContent()";
// mWebView.loadUrl(urlinit);
}
});
}
/**
* js方法回调
*/
private class JsToJava {
@JavascriptInterface
public void jsCallbackMethod(String result) {
Log.e("444", "result==" + result);
}
}
@Override
public void onDestroy() {
super.onDestroy();
cleanWebView();
}
void cleanWebView() {
// 清WebView
// 清WebView
if (mWebView != null) {
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
mWebView.setWebChromeClient(null);
mWebView.setWebViewClient(null);
mWebView.getSettings().setJavaScriptEnabled(false);
mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
mWebView.clearHistory();
mWebView.clearCache(true);
mWebView.freeMemory();
mWebView.removeAllViews();
mWebView.destroy();
mWebView = null;
}
}
说明:
mWebView.addJavascriptInterface(new JsToJava(), "stub"); //JsToJava是内部类,代码在后面。stub是接口名字。
JsToJava:类JsToJava是我们向WebView注册一个名叫“JsToJava”的对象,然后在JS中可以访问到JsToJava这个对象,就可以调用这个对象的一些方法,最终可以调用到Java代码中,从而实现了JS与Java代码的交互。
"stub":是上述类起的一个名字,任意定义。在js回调到java代码时,需要通过这个name叫stub的接口进行回调。
String url2 = "javascript:jclqBonusRange(" + e + "," + t + ")"; //调用js方法
这里是案例的js代码方法,以下会说明。
步骤三:
一般情况下,js只提供完成相关业务的逻辑方法,方便各端通用。Android调用这样的逻辑,一般需要再次进行处理,在js中增加我们需要的返回结果。js增加的方法如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript" charset="utf-8">
/********************这里是万把行的js逻辑代码*******************/
/**
* 增加的方法,java调用,同时返回结果到java中
*/
function jclqBonusRange(e,t){
var objectE = JSON.parse(e);
var objectT = JSON.parse(t);
lotteryId = 30105;
bs = 1
footballCalc.countRange(objectE,objectT,bs,lotteryId);
var bonus = Es.jclq.getHitList(objectE,objectT);
var bonusJson = JSON.stringify(bonus);
window.stub.jsCallbackMethod(bonusJson);
}
</script>
</body>
</html>
说明:
这里关键就这句代码
window.stub.jsCallbackMethod(bonusJson);
js返回结果到java代码,stub就是在java代码中注册的js回调接口类名,jsCallbackMethod是这个接口类名中回调的发方法。