普通js和android的五种通信机制

  1. 使用弹出框形式诸如prompt,alert,confrm
//1. 在cordova中使用prompt进行js->native的通信,参见"cordova/android/promptbasednativeapi"模块
prompt(value, 'gap_bridge_mode:1');

//2. native基于WebChromeClient类拦截弹出信息(对应cordova android sdk SystemWebChromeClient.java)

@Override 
public boolean onJsPrompt(WebView view, String origin, String message, String defaultValue, final JsPromptResult result) {
    //defaultValue对应prompt参数2,origin位请求源(拿个域名下的网页)
    return true;
}

2.让原生主动暴露对象 webview.addJavascriptInterface

class SystemExposedJsApi implements ExposedJsApi {
    private final CordovaBridge bridge;

    SystemExposedJsApi(CordovaBridge bridge) {
        this.bridge = bridge;
    }

    @JavascriptInterface
    public String exec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException {
        return bridge.jsExec(bridgeSecret, service, action, callbackId, arguments);
    }

    @JavascriptInterface
    public void setNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException {
        bridge.jsSetNativeToJsBridgeMode(bridgeSecret, value);
    }

    @JavascriptInterface
    public String retrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException {
        return bridge.jsRetrieveJsMessages(bridgeSecret, fromOnlineEvent);
    }
}

webView.addJavascriptInterface(new SystemExposedJsApi(bridge), "_cordovaNative");

window._cordovaNative.retrieveJsMessages()

参考例子 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0402/1105.html

3.通过调用webview.setNetworkAvailable(true)方法触发document online/offline事件

 native:

  webView.setNetworkAvailable(true);

 js:

 window.addEventListener('online', pollOnceFromOnlineEvent, false);
 window.addEventListener('offline', pollOnceFromOnlineEvent, false);

注:在cordova中原生通过触发文档的online/offline事件,js端在online/offline事件触发时
再主动去调用原生暴露的API检索原生的中的变量来获取插件的执行结果

注:该种通信方式对应的是OnlineEventsBridgeMode ,可以在NativeToJsMessageQueue.java文件中找到
在SystemWebViewEngine.java init方法被添加

4. 使用webview.loadUrl("javascript:code")

该效果等同于在浏览器的地址栏当中输入"javascript:console.log('abc')"此时浏览器会以脚本的方式执行输入内容
可以以这种方式访问其他脚本中的其他变量,方法等

注:在cordova中native通过该种方式来将数据回传给js,对应的桥接模式(native和js通信方式)为LoadUrlBridgeMode

比如js中执行了如下方法
var callbacks = {}
function exec(callbackId,success,fail){
    callbacks[callbackId] = {success:success,fail:fail}
}

function callbackFromNative(callbackId,successData,error){
    if(successData){
        callbacks[callbackId].success(successData)
    }
    if(error){
        callbacks[callbackId].fail(error)
    }
}

exec('123456',function(data){ console.log('success') },function(err){ console.log('fail')})

native中则可以通过以下方式将数据回传
webview.loadUrl("callbackFromNative('123456',{name:"zzz"},error)")

注:该种通信方式对应的是LoadUrlBridgeMode ,可以在NativeToJsMessageQueue.java文件中找到
在SystemWebViewEngine.java init方法被添加

5.基于webView.evaluateJavascript方式执行脚本

该方式类似于loadUrl,也是通过执行脚本来访问js
举例:
webview.evaluateJavascript("(function() { return 'this'; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints: "this"
    }
});

参数1为需要执行的脚本,参数1执行脚本返回的结果将做为参数2的参数

注:该种通信方式对应的是EvalBridgeMode ,可以在NativeToJsMessageQueue.java文件中找到
在SystemWebViewEngine.java init方法被添加

results matching ""

    No results matching ""