Cordova原理二


在上一篇文章中(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,到了這里,相信你應該比較清楚這個交互流程了。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM