成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Cordova插件中JavaScript代碼與Java的交互細節(jié)介紹

MycLambert / 2802人閱讀

摘要:那么本身是代碼,它是怎么調(diào)用到的實現(xiàn)的本文就會介紹這個細節(jié)。下圖是離線存儲插件的實現(xiàn)代碼的一部分。待執(zhí)行的的實現(xiàn)類名稱。傳遞給的參數(shù)數(shù)組。

在Cordova官網(wǎng)中有這么一張架構(gòu)圖:大家看右下角藍色的矩形框"Custom Plugin"——自定義插件。意思就是如果您用Cordova打包Mobile應(yīng)用時,發(fā)現(xiàn)您的移動應(yīng)用里需要使用一些功能,這些功能用普通的JavaScript無法實現(xiàn),而是需要調(diào)用移動平臺的一些原生API才能實現(xiàn)時,我們就需要自己實現(xiàn)自定義插件。這些插件通過在特定的移動平臺上采用原生開發(fā)實現(xiàn),比如Android Studio中的Java開發(fā),然后再通過JavaScript wrapper的方式暴露給您的Mobile應(yīng)用。比如您是用Cordova在Android平臺上打包生成APK文件,那么您的Mobile代碼(JavaScript)里還是不會直接調(diào)用您用Java實現(xiàn)的Custom Plugin,而是調(diào)用Custom Plugin對應(yīng)的JavaScript wrapper。

那么JavaScript wrapper本身是JavaScript代碼,它是怎么調(diào)用到Custom Plugin的Java實現(xiàn)的?本文就會介紹這個細節(jié)。

下圖是OData離線存儲插件(OData Offline Store)的JavaScript實現(xiàn)代碼的一部分。下圖第232行會調(diào)用設(shè)備的native API進行離線存儲的打開操作:

exec(win, error, "OData", "openOfflineStore", [this, options ? options : {}]);

這個exec函數(shù)從哪里來?由Cordova框架實現(xiàn),通過語句 require(‘cordova/exec’)返回。

那么當(dāng)應(yīng)用執(zhí)行到JavaScript代碼:exec(win, error, "OData", "openOfflineStore", [this, options ? options : {}]); 的時候,程序流是如何從這個JavaScript的exec函數(shù)進入到Android平臺的原生API執(zhí)行呢?

打開PackagedApp文件夾里的android子文件夾,有一個JavaScript文件:cordova.js:

里面能看到函數(shù)exec的定義和實現(xiàn):

進而去查看androidExec函數(shù)的實現(xiàn)細節(jié):

第938行:var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);

第943行的五個參數(shù)含義:

success, fail, service, action, args

success & fail: JavaScript回調(diào)函數(shù),當(dāng)移動平臺上的Java原生API執(zhí)行完畢后,這個JavaScript回調(diào)函數(shù)會被調(diào)用到。

service: 待執(zhí)行的Java Native API的Java實現(xiàn)類名稱。

action: 待執(zhí)行的Java Native API的Java實現(xiàn)類的方法名稱。

args: JavaScript傳遞給Java native API的參數(shù)數(shù)組。

2. 在安卓平臺上,JavaScript調(diào)用Java的技術(shù)實現(xiàn)方式有兩種:定義在下圖JavaScript代碼中的jsToNativeModes對象中:PROMPT和JS_OBJECT。相對應(yīng)的,Java調(diào)用JavaScript有三種模式:POLLING, LOAD_URL和ONLINE_EVENT:

看下面這段Java代碼,暴露了一個方法getSomeString給JavaScript端消費:

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代碼里消費上述Java代碼暴露的getSomeString方法:

我們再回過頭來看看AndroidExec的實現(xiàn):

var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);

在AndroidExec的實現(xiàn)里, nativeApiProvider的get方法返回一個實例,然后執(zhí)行exec方法。而881行代碼說明nativeApiProvider的實現(xiàn)位于文件夾cordova/android下面的nativeapiprovider.js里:

打開nativeapiprovider.js,在第21行的注釋里我們得到了重要信息: currentApi要么來自Java文件ExposedJsApi.java,要么來自PromptBasedNativeApi.java。

Java文件ExposedJsApi.java可以在這個文件夾內(nèi)找到:

platform/android/CordovaLib/src/org/apache/cordova

ExposedJsApi實際就是個Java interface,上面聲明了一個exec方法:

JavaScript到Java的執(zhí)行通過prompt調(diào)用完成:

Java類SystemExposedJsApi實現(xiàn)了這個interface,再將執(zhí)行流轉(zhuǎn)交給類CordovaBridge的實例.

CordovaBridge再調(diào)用PluginManager:

PluginManager首先根據(jù)名字找到負責(zé)處理該請求的Java plugin的實現(xiàn)類,再調(diào)用該實現(xiàn)類的方法:

以O(shè)Data離線存儲的實現(xiàn)類為例,我們在其實現(xiàn)代碼里能發(fā)現(xiàn)有大量的IF-ELSE分支,每個分支處理不同的離線存儲操作請求。

要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注公眾號"汪子熙"或者掃描下面二維碼:

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71748.html

相關(guān)文章

  • Cordova插件JavaScript代碼Java交互細節(jié)介紹

    摘要:那么本身是代碼,它是怎么調(diào)用到的實現(xiàn)的本文就會介紹這個細節(jié)。下圖是離線存儲插件的實現(xiàn)代碼的一部分。待執(zhí)行的的實現(xiàn)類名稱。傳遞給的參數(shù)數(shù)組。 在Cordova官網(wǎng)中有這么一張架構(gòu)圖:大家看右下角藍色的矩形框Custom Plugin——自定義插件。意思就是如果您用Cordova打包Mobile應(yīng)用時,發(fā)現(xiàn)您的移動應(yīng)用里需要使用一些功能,這些功能用普通的JavaScript無法實現(xiàn),而是需...

    sf_wangchong 評論0 收藏0
  • Cordova應(yīng)用JavaScript代碼和自定義插件代碼調(diào)試

    摘要:首先打開安卓手機的調(diào)試模式,然后用數(shù)據(jù)線連接到電腦上。打開開發(fā)者工具,這里我就能看到我正在運行應(yīng)用的三星手機,,狀態(tài)處于已連接狀態(tài)。 我之前寫過三篇Cordova相關(guān)的技術(shù)文章。當(dāng)我們使用Cordova將自己開發(fā)的前端應(yīng)用打包安裝到手機上后,可能會遇到需要調(diào)試Cordova應(yīng)用的時候。 本文就介紹Cordova應(yīng)用的調(diào)試步驟。 如果大家讀過之前我寫的文章,就知道Cordova應(yīng)用在移動...

    LiangJ 評論0 收藏0
  • cordova研習(xí)筆記(一) —— 初試牛刀之cordova.js概要

    摘要:任何初始化任務(wù)應(yīng)該在文件中的事件的事件處理函數(shù)中。這個配置文件有幾個地方很關(guān)鍵,一開始沒有認(rèn)真看,將插件導(dǎo)進工程跑的時候各種問題,十分頭痛,不得不重新認(rèn)真看看文檔。 前言 來新公司的第一個任務(wù),研究hybrid App中間層實現(xiàn)原理,做中間層插件開發(fā)。這個任務(wù)挺有意思,也很有挑戰(zhàn)性,之前在DCloud雖然做過5+ App開發(fā),但是中間層的東西確實涉及不多。本系列文章屬于系列開篇cord...

    buildupchao 評論0 收藏0
  • 使用JavaScript調(diào)用手機平臺上原生API

    摘要:注意看下圖紅色高亮的,起到了一個橋梁的作用,溝通了應(yīng)用中的前端代碼和手機操作系統(tǒng)中的原生。 我之前曾經(jīng)寫過一篇文章使用Cordova將您的前端JavaScript應(yīng)用打包成手機原生應(yīng)用,介紹了如何使用Cordova框架將您的用JavaScript和HTML開發(fā)的前端應(yīng)用打包成某個手機平臺(比如Android,iOS)的原生應(yīng)用。 那么,您也許會有一些需求,需要在您的前端應(yīng)用里使用到手機...

    bingchen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<