map = new java.util.HashMap<>();\n");
writer.write(" private JSBridge(){\n");
for (Map.Entryentry : map.entrySet()) {
writer.write(String.format(" map.put(\"%s\",%s); \n", entry.getKey(), entry.getValue()));
}
writer.write(" }\n");
writer.write(" public static final JSBridge get(){\n");
writer.write(" return INSTANCE;\n");
writer.write(" }\n");
writer.write(" public String getJsCode(){\n");
writer.write(" return \"" + jsCode + "\";\n");
writer.write(" }\n");
writer.write(
" /**注册对象, 被@JsPlugin注解标记的对象会自动注入,并调用空参的构造函数,\n 如果需要重写构造,需保留空参的构造,并调用此方法注册\n */\n");
writer.write(" public void register(String name,Object obj){\n");
writer.write(" map.put(name,obj);\n");
writer.write(" }\n");
writer.write(" public Object queryJavaObject(String name){\n");
writer.write(" return map.get(name);\n");
writer.write(" }\n");
/* writer.write(" public void callJsReady(com.liwg.jsbridge.library.BridgeWebView webview){\n");
writer.write(" webview.callJsMethod(\"JSBridgeReady()\");\n");
writer.write(" }\n");*/
writer.write(" }\n");
} catch (Exception e) {
error(e.getLocalizedMessage(),roundEnv.getRootElements().iterator().next());
} finally {
writer.close();
}
}
private boolean filterMethod(String[] filter, String methodName) {
int length = filter == null ? 0 : filter.length;
for (int i = 0; i < length; i++) {
if (filter[i].equals(methodName)) {
return true;
}
}
return false;
}
void error(CharSequence msg, Element element) {
mMessager.printMessage(Diagnostic.Kind.WARNING, msg, element);
}
}
```
#### 生成的代码
```java
final class JSBridge implements com.liwg.jsbridge.library.IJSBridge{
public static final JSBridge INSTANCE = new JSBridge();
public java.util.Mapmap = new java.util.HashMap<>();
private JSBridge(){
//生成 注入 js对象名和java对象的映射
map.put("AB",new com.src.wugang.jsbridge.MainActivity.AB());
map.put("Plugin",new com.src.wugang.jsbridge.A());
}
public static final JSBridge get(){
return INSTANCE;
}
public String getJsCode(){
return "if(typeof(window.Plugin)=='undefined'){ window.Plugin = {test:function(){ return EasyJS.call('Plugin', 'test', Array.prototype.slice.call(arguments));},test1:function(){ return EasyJS.call('Plugin', 'test1', Array.prototype.slice.call(arguments));}}}if(typeof(window.AB)=='undefined'){ window.AB = {test:function(){ return EasyJS.call('AB', 'test', Array.prototype.slice.call(arguments));},test1:function(){ return EasyJS.call('AB', 'test1', Array.prototype.slice.call(arguments));},test2:function(){ return EasyJS.call('AB', 'test2', Array.prototype.slice.call(arguments));}}}if(window.EasyJS&&window.EasyJS.injectFlag==0){if(JSBridgeReady){JSBridgeReady();window.EasyJS.injectFlag=1}}";
}
/**注册对象, 被@JsPlugin注解标记的对象会自动注入,并调用空参的构造函数,
如果需要重写构造,需保留空参的构造,并调用此方法注册
*/
public void register(String name,Object obj){
map.put(name,obj);
}
public Object queryJavaObject(String name){
return map.get(name);
}
}
```
#### 使用方式
~~~xml
~~~
### Activity
- 注入的插件对象必须实现JsPlugin接口,所有需要注入的对象必须继承JsPlugin这个类并且 加上 @JsInject 注解标记
- 被 @JsInject 标记的类会被自动注入,并调用空参的构造创建对象,如果有自定义构造 可以使用 ***webView.getJsBridge().register()***
- 如果该类中的方法不希望被注入可以 使用 @JsInject 注解上的 filter参数过滤掉
~~~java
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PreLoadManager.get(this).preload("http://www.baidu.com", "http://www.youku.com");
BridgeWebView webView = (BridgeWebView) findViewById(R.id.web_view);
webView.getJsBridge().register("AB",new AB(this));
webView.loadUrl("file:///android_asset/test.html");
WebView.setWebContentsDebuggingEnabled(true);
}
@JsInject public static class AB extends JsPlugin {
private Context context;
public AB() {
}
public AB(Context context) {
this.context = context;
}
public void test(String s, JSFunction jsFunction) {
Toast.makeText(context, "js调用我", 1).show();
jsFunction.execute("test execute " + s);
}
public void test1() {
Log.e("-------", "test1: ");
}
public void test2() {
Log.e("-------", "test2: ");
}
}
}
~~~
HTML&JS代码
```js
refresh
```
#### 网页预加载
~~~java
//预加载,推荐在Application中调用
PreLoadManager.get(this).preload("http://www.baidu.com", "http://www.youku.com");
~~~
###### Activity 中使用
~~~java
public class PreLoadActivity extends AppCompatActivity {
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BridgeWebView webView = PreLoadManager.get(this).getWebView();
setContentView(webView);
webView.setWebViewClient(new WebViewClient(){
@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if(request.hasGesture()){
Intent intent = new Intent(PreLoadActivity.this,PreLoadActivity.class);
intent.putExtra("url",request.getUrl());
startActivity(intent);
return true;
}
return super.shouldOverrideUrlLoading(view, request);
}
});
webView.loadUrl(getIntent().getStringExtra("url"));
}
}
~~~
### 项目结构图
![](/contentImages/image/20180508/QkmcPxfYzQ9ZVzn6Xx8.png)
[参考项目https://github.com/lwugang/safe-java-js-webview-bridge](https://github.com/lwugang/safe-java-js-webview-bridge)
[参考项目https://github.com/dukeland/EasyJSWebView](https://github.com/dukeland/EasyJSWebView)