android js控制对象,android js 互相调用

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值