开源项目地址:Android-JS-Inject
让android的js注入更加简单,更加方便在 java与js端互传回调函数。
下面是一个简单的例子,完整代码和详细的使用方法见源项目,里面有demo。
FunctionActivity.java
package com.test.android.injectjs.demofunction;
import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.webkit.WebView;
import android.widget.Toast;
import com.chenyg.androidjs.*;
/**
* 测试java与js之间的函数的传递。
*/
public class FunctionActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
WebView wv = new WebView(this);
setContentView(wv);
WEBUtil.defaultSettings(wv);
Java2JsCallback java2JsCallback = new Java2JsCallback(new WEBViewImpl(wv))
{
@Callback
public void callback(String content)
{
Toast.makeText(FunctionActivity.this, content, Toast.LENGTH_SHORT).show();
}
};
java2JsCallback.setPermanent(true);
wv.setWebChromeClient(
new WEBChromeClient(false, true, new JsCallJava.InjectObj("demo.fun", new Js1(java2JsCallback))));
wv.loadUrl("file:///android_asset/test-fun/test.html");
}
}
Js1.java
package com.test.android.injectjs.demofunction;
import android.widget.Toast;
import com.chenyg.androidjs.Java2JsCallback;
import com.chenyg.androidjs.JsCallback;
import com.chenyg.androidjs.WEBView;
import org.json.JSONArray;
import org.json.JSONObject;
/**
*/
public class Js1
{
private Java2JsCallback java2JsCallback;
public void toast(WEBView webView, String message)
{
Toast.makeText(webView.getContext(), message, Toast.LENGTH_SHORT).show();
}
/**
* @param java2JsCallback 用于动态传递到js端的java函数对象。
*/
public Js1(Java2JsCallback java2JsCallback)
{
this.java2JsCallback = java2JsCallback;
}
/**
* js函数直接作为java函数参数。
*
* @param view
* @param callback
*/
public void jsFun(WEBView view, JsCallback callback)
{
try
{
callback.apply();
} catch (Exception e)
{
e.printStackTrace();
}
}
/**
* js函数作为json对象的内部变量。
*
* @param view
* @param jsonObject
*/
public void jsFun(WEBView view, JSONObject jsonObject)
{
try
{
JsCallback callback = (JsCallback) jsonObject.get("callback");
callback.apply();
} catch (Exception e)
{
e.printStackTrace();
}
}
/**
* js函数作为json数组的元素。
*
* @param view
* @param jsonArray
*/
public void jsFunArray(WEBView view, JSONArray jsonArray)
{
try
{
JsCallback callback = (JsCallback) jsonArray.get(0);
callback.apply();
} catch (Exception e)
{
e.printStackTrace();
}
}
/**
* js函数作为json对象的json数组的元素。
*
* @param view
* @param jsonObject
*/
public void jsFunArray(WEBView view, JSONObject jsonObject)
{
try
{
JsCallback callback = (JsCallback) jsonObject.getJSONArray("array").get(0);
callback.apply();
} catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 直接传递java函数对象。
*
* @param view
* @param callback
*/
public void sendJavaFun(WEBView view, JsCallback callback)
{
try
{
callback.apply(java2JsCallback);
} catch (JsCallback.JsCallbackException e)
{
e.printStackTrace();
}
}
/**
* java函数对象作为json对象的一个变量。
*
* @param view
* @param callback
*/
public void sendJavaFunInJson(WEBView view, JsCallback callback)
{
try
{
JSONObject jsonObject = new JSONObject();
jsonObject.put("callback", java2JsCallback);
callback.apply(jsonObject);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
test.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>函数相关的测试</title>
<meta name="author" content="Yanyuetian">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1, target-densitydpi=medium-dpi, user-scalable=no">
<link href="../default.css" rel="stylesheet" type="text/css"/>
<script src="../jquery-2.2.3.min.js" type="text/javascript"></script>
<script src="../inject.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
console.log("ready!");
window.injectReady(false,function(){
demo.fun.toast('js已注入成功!');
});
});
</script>
</head>
<body>
<div class="blog-header">
<h3>函数相关的测试</h3>
</div>
<ul class="entry">
<li>
js函数直接作为java函数参数<br/>
代码:<br/>
<div>
demo.fun.jsFun(function(){
alert('js函数直接作为java函数参数');
});
</div>
<button οnclick="demo.fun.jsFun(function(){alert('js函数直接作为java函数参数');});">测试</button>
</li>
<br/>
<li>
js函数作为json对象的内部变量<br/>
代码:<br/>
<div>
demo.fun.jsFun({
'callback':function(){
alert('js函数作为json对象的内部变量');
}
});
</div>
<button οnclick="demo.fun.jsFun({'callback':function(){alert('js函数作为json对象的内部变量');}});">测试</button>
</li>
<br/>
<li>
js函数作为json数组的元素<br/>
代码:<br/>
<div>
demo.fun.jsFunArray([function(){
alert('js函数作为json数组的元素');
}]);
</div>
<button οnclick="demo.fun.jsFunArray([function(){alert('js函数作为json数组的元素');}]);">测试</button>
</li>
<br/>
<li>
js函数作为json对象的json数组的元素<br/>
代码:<br/>
<div>
demo.fun.jsFunArray({
'array':[function(){
alert('js函数作为json对象的json数组的一个元素');
}]
});
</div>
<button οnclick="demo.fun.jsFunArray({'array':[function(){alert('js函数作为json对象的json数组的一个元素');}]});">测试</button>
</li>
<br/>
<li>
直接传递java函数对象<br/>
代码:<br/>
<div>
demo.fun.sendJavaFun(function(javaCall){
javaCall('直接传递java函数对象');
});
</div>
<button οnclick="demo.fun.sendJavaFun(function(javaCall){javaCall('直接传递java函数对象');});">测试</button>
</li>
<br/>
<li>
java函数对象作为json对象的一个变量<br/>
代码:<br/>
<div>
demo.fun.sendJavaFunInJson(function(obj){
obj.callback('java函数对象作为json对象的一个变量');
});
</div>
<button οnclick="demo.fun.sendJavaFunInJson(function(obj){obj.callback('java函数对象作为json对象的一个变量');});">测试
</button>
</li>
</ul>
</body>
</html>
图1
图2
图3