Android JSBridge实现与前端的交互

 

Android JSBridge实现与前端的交互

示例:

结合图形的步骤标号逻辑,我们来给出示例进行分析:

1.必须先确定Url的具体格式,是为了统一前端与Android的互相调用,也就是干活前先得签订一个协议。参考http制定的协议为:jsbridge://className:port/methodName?jsonObj

解释一下:1)className:Android端实现暴露给前端的类名;2)port:Android返回结果给前端的端口;

3)methodName:前端需要调用的函数 ;4)前端给Android传递的参数,这里传递的是一个json对象

 

2.好了,下面正式的开始干活了,HTML文件命名为index.html,有一个click事件的界面,触发点击事件

 

<button οnclick="JSBridge.call('bridge','showToast',{'msg':'Hello JSBridge'},function(res){alert(JSON.stringify(res))})">
    测试showToast
</button>

 

3.JavaScript文件命名为JSBridge.js, 第2步中的JSBridge.call即为调用JSBridge.js中的call方法,后面带了四个参数

 

call: function (obj, method, params, callback) {
    console.log(obj+" "+method+" "+params+" "+callback);
    var port = Util.getPort();
    console.log(port);
    this.callbacks[port] = callback;
    var uri=Util.getUri(obj,method,params,port);
    console.log(uri);
    window.prompt(uri, "");
},

JSBridge.js中的call方法,最后调用了window.prompt方法,这个方法就是触发Android端webChromeClient的回调函数用的

 

 

4.window.prompt触发了WebChromeClient(这个需要使用函数WebView.setWebChromeClient(new WebChromeClietn())进行设定)

类中的如下回调onJsPrompt。太棒了,这个时候就完成了前端与Android端的通信了,因为前端的信息都顺利

通过这个函数传递给Android了。

 

@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
    result.confirm(JSBridge.callJava(view,message));
    return true;
}

 

5.Android中会定义一个类JSBridge.Java来管理暴露给前端使用的函数。这个类有两个功能:1)暴露给前端的函数的动态注册功能。

2)解析前端信息,调用了Android端对应的函数,这个示例中是:showToast函数

 

 
解析前端的信息,获取前端调用的函数名:
Uri uri = Uri.parse(uriString);
className = uri.getHost();
param = uri.getQuery();
port = uri.getPort() + "";
String path = uri.getPath();
 
HashMap< String, Method> methodHashMap = exposedMethod.get(className);
Method method = methodHashMap.get(methodName);
 
通过获取的函数名,这里是showToast,调用Android端的showToast函数
method.invoke(null,webView,new JSONObject(param),new Callback(webView,port));//

 

 

6.定义类BridgeImpl.java来具体的实现暴露给前端的所有函数。这里的showToast函数如下

 

public static void showToast(WebView webView, JSONObject param, final JSBridge.Callback callback){
    String message = param.optString("msg");
    Toast.makeText(webView.getContext(),message,Toast.LENGTH_LONG).show();
    if(null != callback){
        try {
            JSONObject object = new JSONObject();
            object.put("key","value");
            object.put("key1","vaule1");
            callback.apply(getJSONObject(0,"ok",object));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

转载于:https://my.oschina.net/kun123/blog/868710