在上一篇文章中(http://www.cnblogs.com/StephenWu/p/6580362.html),和大家分享了從TS到cordova plugin native代碼的詳細過程。
這篇我們要詳細的介紹下cordovaLib的工作原理。首先 我們看下到了cordova plugin的native后,CordovaLib是如何把插件的native集成到項目中去的。
如果支持@JavescriptInterface,那么我們通過SystemWebview來調用ExposedJsApi里的exec方法,在SystemExposedJsApi中調用CordovaBridge的jsExec方法。
CordovaBridge功能:
PluginManager對象:用於管理當前應用的所有的plugin對象
NativeToJsMessageQueue對象:native 到 Js的通信方式,發送給js的消息隊列。
如果不支持@JavescriptInterface,那么直接調用CordovaBridge里的promptOnJsPrompt方法,通過解析是否有”gap:“,如果有的話從傳過來的字符串中第四個字符開始解析成具體的參數,然后調用jsExec方法。
CordovaBridge里會通過參數service(字符串,plugin的name),PluginManage會從插件列表中找到具體的CordovaPlugin對象,執行相應的exec方法。所以在android里一個插件的所有方法都只會調用到插件的exec一個方法中,所以這就導致我們在寫插件的時候,如果這個插件對外暴露的接口比較多,我們就要在這個方法里寫很多的if else或是用switch語句來區分每個調用。
2.插件執行完后,需要把結果返回給ts的調用端。具體流程是:
返回結果是通過CallBackContext來完成封裝的,CallBackContext的數據結構如下:
private String callbackId; // 在js端生成,保存在native端 private CordovaWebView webView; //webview對象 protected boolean finished; //這個callback是否結束,如果結束在js端(cordova.js)就會把這個callbackid從列表中刪掉,否則這個callback將一直存在,也就是說明你可以用這個callbackContext一直和js保持通信
而返回的數據結構是同PluginResult來封裝的。
private final int status; //狀態碼 private final int messageType; //數據類型,比如是json,string還是其他的 private boolean keepCallback = false; //和CallbackContent里的finished一樣的意思 private String strMessage; //消息 private String encodedMessage; //js消息 private List<PluginResult> multipartMessages;
encodedMessage最后的形式為:
cordova.callbackFromNative(‘TestPlugin1826548897’,true,1,[{“pmValue”:119,“tvocValue”:357}],true);
這樣的消息體.最后通過 evaluateJavascript 或是 loadUrl和JS交互
所有從native到js的消息都會在CordovaBridge里把它放在NativeToJsMessageQueue.最后通過BridgeMode來和js通信。BridgeMode是在一開始的時候設定,有三種mode:
LoadUrlBridgeMode : 這種是通過webView.loadUrl("javascript:")來執行對應的js代碼
OnlineEventsBridgeMode:這種是通過網絡變化來和js進行通信
EvalsBridgeMode: 通過 webView.evaluateJavascript執行對應的js代碼
OK,到了這里,相信你應該比較清楚這個交互流程了。