亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

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

MycLambert / 2827人閱讀

摘要:那么本身是代碼,它是怎么調(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

相關(guān)文章

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

    摘要:那么本身是代碼,它是怎么調(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),而是需...

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

    摘要:首先打開(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)...

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

    摘要:任何初始化任務(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...

    buildupchao 評(píng)論0 收藏0
  • 使用JavaScript調(diào)用手機(jī)平臺(tái)上原生API

    摘要:注意看下圖紅色高亮的,起到了一個(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ī)...

    bingchen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<