img/phonegap/web2native时序图.gif

org.apache.cordova.CordovaChromeClient.onJsConfirm(WebView view, String url, String message, final JsResult result);这个方法会拦截html页面发送过来的Native Api请求(调用window.prompt()),然后交由对应的Plugin处理。

服务器流程:

服务器根据2个参数来判断是同步OR异步,客户端传过来的异步参数 + 服务端Plugin.isSynch(action)

如果是同步,则直接把处理请求并把响应写到客户端;如果是异步,则启动一个线程来处理,处理完后,将结果通过CallbackServer写到客户端。

如果发现变量(javascript)中有数据的话,就写到客户端,如果没有,则睡眠10s,10s后,如果有数据,则写到客户端,否则写一个404异常到客户端然后此次连接中断,重新接收新的客户端请求(客户端有一个轮询,如果服务端返回404,则客户端会每隔一段时间请求一次服务器)

客户端流程

PhoneGap的js框架,在调用Native Api时,都会汇聚到exec这个方法:

define('cordova/exec', function(require, exports, module) {
    var cordova = require('cordova');
module.exports = function(success, fail, service, action, args) {
        try {
            var callbackId = service + cordova.callbackId++;
            if (success || fail) {
                cordova.callbacks[callbackId] = {
                    success: success,
                    fail: fail
                };
            }
        //这里给服务器发送请求,
        //service表示采用哪个
	//true表示采用异步调用
	//服务器会判断这个service+action是否支持异步调用
	//如果是同步,则服务器会立即返回处理结果到变量r
	//如果是异步,则服务器返回空串””
            var r = prompt(JSON.stringify(args),
	    "gap:" + JSON.stringify([service, action, callbackId, true]));
            // If a result was returned
            if (r.length > 0) {
          ……
            }
        } catch(e2) {
            console.log("Error: " + e2);
        }
    };
});

自定义plugin流程

继承com.phonegap.api.Plugin类,重写execute方法public PluginResult execute(String action, JSONArray args, String callbackId){}

在plugins.xml中配置我们的类,<plugin name="LoginPlugin" value="com.synnex.plugin.LoginPlugin"/>

NOTE:isSynch()方法是告诉PhoneGap框架,此处理是同步OR异步,true表示同步,false表示异步,默认为flase。在同步处理的时候,不要去做UI操作(如:修改EditText内容),可以交由Handler更新UI。