摘要:那么本身是代碼,它是怎么調(diào)用到的實(shí)現(xiàn)的本文就會(huì)介紹這個(gè)細(xì)節(jié)。下圖是離線(xiàn)存儲(chǔ)插件的實(shí)現(xiàn)代碼的一部分。待執(zhí)行的的實(shí)現(xiàn)類(lèi)名稱(chēng)。傳遞給的參數(shù)數(shù)組。
在Cordova官網(wǎng)中有這么一張架構(gòu)圖:大家看右下角藍(lán)色的矩形框"Custom Plugin"——自定義插件。意思就是如果您用Cordova打包Mobile應(yīng)用時(shí),發(fā)現(xiàn)您的移動(dòng)應(yīng)用里需要使用一些功能,這些功能用普通的JavaScript無(wú)法實(shí)現(xiàn),而是需要調(diào)用移動(dòng)平臺(tái)的一些原生API才能實(shí)現(xiàn)時(shí),我們就需要自己實(shí)現(xiàn)自定義插件。這些插件通過(guò)在特定的移動(dòng)平臺(tái)上采用原生開(kāi)發(fā)實(shí)現(xiàn),比如Android Studio中的Java開(kāi)發(fā),然后再通過(guò)JavaScript wrapper的方式暴露給您的Mobile應(yīng)用。比如您是用Cordova在Android平臺(tái)上打包生成APK文件,那么您的Mobile代碼(JavaScript)里還是不會(huì)直接調(diào)用您用Java實(shí)現(xiàn)的Custom Plugin,而是調(diào)用Custom Plugin對(duì)應(yīng)的JavaScript wrapper。
那么JavaScript wrapper本身是JavaScript代碼,它是怎么調(diào)用到Custom Plugin的Java實(shí)現(xiàn)的?本文就會(huì)介紹這個(gè)細(xì)節(jié)。
下圖是OData離線(xiàn)存儲(chǔ)插件(OData Offline Store)的JavaScript實(shí)現(xiàn)代碼的一部分。下圖第232行會(huì)調(diào)用設(shè)備的native API進(jìn)行離線(xiàn)存儲(chǔ)的打開(kāi)操作:
exec(win, error, "OData", "openOfflineStore", [this, options ? options : {}]);
這個(gè)exec函數(shù)從哪里來(lái)?由Cordova框架實(shí)現(xiàn),通過(guò)語(yǔ)句 require(‘cordova/exec’)返回。
那么當(dāng)應(yīng)用執(zhí)行到JavaScript代碼:exec(win, error, "OData", "openOfflineStore", [this, options ? options : {}]); 的時(shí)候,程序流是如何從這個(gè)JavaScript的exec函數(shù)進(jìn)入到Android平臺(tái)的原生API執(zhí)行呢?
打開(kāi)PackagedApp文件夾里的android子文件夾,有一個(gè)JavaScript文件:cordova.js:
里面能看到函數(shù)exec的定義和實(shí)現(xiàn):
進(jìn)而去查看androidExec函數(shù)的實(shí)現(xiàn)細(xì)節(jié):
第938行:var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);
第943行的五個(gè)參數(shù)含義:
success, fail, service, action, args
success & fail: JavaScript回調(diào)函數(shù),當(dāng)移動(dòng)平臺(tái)上的Java原生API執(zhí)行完畢后,這個(gè)JavaScript回調(diào)函數(shù)會(huì)被調(diào)用到。
service: 待執(zhí)行的Java Native API的Java實(shí)現(xiàn)類(lèi)名稱(chēng)。
action: 待執(zhí)行的Java Native API的Java實(shí)現(xiàn)類(lèi)的方法名稱(chēng)。
args: JavaScript傳遞給Java native API的參數(shù)數(shù)組。
2. 在安卓平臺(tái)上,JavaScript調(diào)用Java的技術(shù)實(shí)現(xiàn)方式有兩種:定義在下圖JavaScript代碼中的jsToNativeModes對(duì)象中:PROMPT和JS_OBJECT。相對(duì)應(yīng)的,Java調(diào)用JavaScript有三種模式:POLLING, LOAD_URL和ONLINE_EVENT:
看下面這段Java代碼,暴露了一個(gè)方法getSomeString給JavaScript端消費(fèi):
import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; public class WebViewGUI extends Activity { WebView mWebView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWebView = new WebView(this); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new JavaScriptInterface(), "jsinterface"); mWebView.loadUrl("file:///android_asset/www/index.html"); setContentView(mWebView); } final class JavaScriptInterface { JavaScriptInterface() { } public String getSomeString() { return "string"; } } }
在JavaScript代碼里消費(fèi)上述Java代碼暴露的getSomeString方法:
我們?cè)倩剡^(guò)頭來(lái)看看AndroidExec的實(shí)現(xiàn):
var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);
在AndroidExec的實(shí)現(xiàn)里, nativeApiProvider的get方法返回一個(gè)實(shí)例,然后執(zhí)行exec方法。而881行代碼說(shuō)明nativeApiProvider的實(shí)現(xiàn)位于文件夾cordova/android下面的nativeapiprovider.js里:
打開(kāi)nativeapiprovider.js,在第21行的注釋里我們得到了重要信息: currentApi要么來(lái)自Java文件ExposedJsApi.java,要么來(lái)自PromptBasedNativeApi.java。
Java文件ExposedJsApi.java可以在這個(gè)文件夾內(nèi)找到:
platform/android/CordovaLib/src/org/apache/cordova
ExposedJsApi實(shí)際就是個(gè)Java interface,上面聲明了一個(gè)exec方法:
JavaScript到Java的執(zhí)行通過(guò)prompt調(diào)用完成:
Java類(lèi)SystemExposedJsApi實(shí)現(xiàn)了這個(gè)interface,再將執(zhí)行流轉(zhuǎn)交給類(lèi)CordovaBridge的實(shí)例.
CordovaBridge再調(diào)用PluginManager:
PluginManager首先根據(jù)名字找到負(fù)責(zé)處理該請(qǐng)求的Java plugin的實(shí)現(xiàn)類(lèi),再調(diào)用該實(shí)現(xiàn)類(lèi)的方法:
以O(shè)Data離線(xiàn)存儲(chǔ)的實(shí)現(xiàn)類(lèi)為例,我們?cè)谄鋵?shí)現(xiàn)代碼里能發(fā)現(xiàn)有大量的IF-ELSE分支,每個(gè)分支處理不同的離線(xiàn)存儲(chǔ)操作請(qǐng)求。
要獲取更多Jerry的原創(chuàng)技術(shù)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙"或者掃描下面二維碼:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71748.html
摘要:那么本身是代碼,它是怎么調(diào)用到的實(shí)現(xiàn)的本文就會(huì)介紹這個(gè)細(xì)節(jié)。下圖是離線(xiàn)存儲(chǔ)插件的實(shí)現(xiàn)代碼的一部分。待執(zhí)行的的實(shí)現(xiàn)類(lèi)名稱(chēng)。傳遞給的參數(shù)數(shù)組。 在Cordova官網(wǎng)中有這么一張架構(gòu)圖:大家看右下角藍(lán)色的矩形框Custom Plugin——自定義插件。意思就是如果您用Cordova打包Mobile應(yīng)用時(shí),發(fā)現(xiàn)您的移動(dòng)應(yīng)用里需要使用一些功能,這些功能用普通的JavaScript無(wú)法實(shí)現(xiàn),而是需...
摘要:首先打開(kāi)安卓手機(jī)的調(diào)試模式,然后用數(shù)據(jù)線(xiàn)連接到電腦上。打開(kāi)開(kāi)發(fā)者工具,這里我就能看到我正在運(yùn)行應(yīng)用的三星手機(jī),,狀態(tài)處于已連接狀態(tài)。 我之前寫(xiě)過(guò)三篇Cordova相關(guān)的技術(shù)文章。當(dāng)我們使用Cordova將自己開(kāi)發(fā)的前端應(yīng)用打包安裝到手機(jī)上后,可能會(huì)遇到需要調(diào)試Cordova應(yīng)用的時(shí)候。 本文就介紹Cordova應(yīng)用的調(diào)試步驟。 如果大家讀過(guò)之前我寫(xiě)的文章,就知道Cordova應(yīng)用在移動(dòng)...
摘要:任何初始化任務(wù)應(yīng)該在文件中的事件的事件處理函數(shù)中。這個(gè)配置文件有幾個(gè)地方很關(guān)鍵,一開(kāi)始沒(méi)有認(rèn)真看,將插件導(dǎo)進(jìn)工程跑的時(shí)候各種問(wèn)題,十分頭痛,不得不重新認(rèn)真看看文檔。 前言 來(lái)新公司的第一個(gè)任務(wù),研究hybrid App中間層實(shí)現(xiàn)原理,做中間層插件開(kāi)發(fā)。這個(gè)任務(wù)挺有意思,也很有挑戰(zhàn)性,之前在DCloud雖然做過(guò)5+ App開(kāi)發(fā),但是中間層的東西確實(shí)涉及不多。本系列文章屬于系列開(kāi)篇cord...
摘要:注意看下圖紅色高亮的,起到了一個(gè)橋梁的作用,溝通了應(yīng)用中的前端代碼和手機(jī)操作系統(tǒng)中的原生。 我之前曾經(jīng)寫(xiě)過(guò)一篇文章使用Cordova將您的前端JavaScript應(yīng)用打包成手機(jī)原生應(yīng)用,介紹了如何使用Cordova框架將您的用JavaScript和HTML開(kāi)發(fā)的前端應(yīng)用打包成某個(gè)手機(jī)平臺(tái)(比如Android,iOS)的原生應(yīng)用。 那么,您也許會(huì)有一些需求,需要在您的前端應(yīng)用里使用到手機(jī)...
閱讀 4090·2021-11-24 09:38
閱讀 1531·2021-11-19 09:40
閱讀 2837·2021-11-18 10:02
閱讀 3771·2021-11-09 09:46
閱讀 1882·2021-09-22 15:27
閱讀 3170·2019-08-29 15:24
閱讀 1056·2019-08-29 12:40
閱讀 1742·2019-08-28 18:24