欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Cordova插件實現(xiàn)JavaScript與Java的通信的詳細過程

 更新時間:2021年06月10日 14:27:02   作者:華為移動服務  
本文將結合最常用的華為推送服務Cordova插件,介紹HMS Core用到的JS-Java消息交互方式,講解在JS側如何調用Java側接口,最終實現(xiàn)HMS Core能力,感興趣的朋友一起學習下吧

背景

Cordova平臺是開源的跨平臺開發(fā)框架,被廣泛應用于移動應用開發(fā)領域,可以開發(fā)跨安卓、iOS等系統(tǒng)的應用。Cordova平臺是基于HTML/JavaScript語言,它是如何在不同平臺上能夠運行并實現(xiàn)相應功能的呢?這里就用到了Cordova提供的豐富的插件,Cordova的大量插件結合自身的框架,為應用開發(fā)者提供了跨平臺的能力,開發(fā)者不需要與操作系統(tǒng)層面的接口進行交互,可以關注于應用功能本身。HMS Core為了方便Cordova開發(fā)者能夠更方便快速的接入HMS Core的能力,也針對各能力提供了Cordova的插件。

簡介

這里將結合最常用的華為推送服務Cordova插件,介紹HMS Core用到的JS-Java消息交互方式,講解在JS側如何調用Java側接口,最終實現(xiàn)HMS Core能力。當然,在進行問題定位時也可以參考本文進行分析。

Cordova基本結構

App啟動時,在MainActivity中調用loadUrl函數(shù),即觸發(fā)了CordovaWebView的初始化,進行Cordova的啟動。此時CordovaWebView會創(chuàng)建PluginManager對象,NativeToJsMessageQueue對象以及JavascriptInterface的ExposedJsApi對象。在后續(xù)的消息交互中,則主要通過ExposedJsApi和NativeToJsMessageQueue進行。

插件的加載分兩步。首先,在PluginManager對象創(chuàng)建時,讀取配置文件中的所有Plugin,并創(chuàng)建映射;而在第一次調用該插件時,進行實例化,并執(zhí)行相關功能。

消息返回模式包含同步和異步兩種模式,Cordova中通過在函數(shù)中配置async關鍵字進行區(qū)分。

對于同步模式,系統(tǒng)會從NativeToJsMessageQueue隊列頭獲取數(shù)據(jù),并返回。然后再根據(jù)callbackID查找到請求,返回給success函數(shù)。

對于異步模式,執(zhí)行后會啟動循環(huán)函數(shù)不停的獲取隊列中的數(shù)據(jù)。查找到對應的請求時,返回給success函數(shù)。

華為推送服務的插件中,采用的是同步的方式。

以推送為樣例說明插件調用方式

如果以上沒有看懂,沒有關系,只要了解下面的過程即可。

1. 插件安裝

執(zhí)行命令 cordova plugin add @hmscore/cordova-plugin-hms-push 安裝最新插件。執(zhí)行后會在plugins中增加插件信息。

其中在plugin.xml中記錄了所有用到的js類,android類等信息,在plugin初始化時會將其加載到系統(tǒng)中,如果某個函數(shù)或接口未在其中進行配置,會導致無法使用。

2. 消息映射

插件提供了4種消息映射方式:

(1) HmsMessaging消息調用

在HmsPush.js中通過runHmsMessaging接口將消息轉給Android平臺,通過異步調用方式,Android返回的結果將通過Promise返回。

消息將會轉到HmsPushMessaging類中,在HmsPushMessaging的execute函數(shù)中,根據(jù)各功能的不同,轉向不同的函數(shù)進行處理:

public void execute(String action, final JSONArray args, final CallbackContext callbackContext)
        throws JSONException {
    hmsLogger.startMethodExecutionTimer(action);
    switch (action) {
        case "isAutoInitEnabled":
            isAutoInitEnabled(callbackContext);
            break;
        case "setAutoInitEnabled":
            setAutoInitEnabled(args.getBoolean(1), callbackContext);
            break;
        case "turnOffPush":
            turnOffPush(callbackContext);
            break;
        case "turnOnPush":
            turnOnPush(callbackContext);
            break;
        case "subscribe":
            subscribe(args.getString(1), callbackContext);
            break;

在各函數(shù)調用中,通過設置結果的方式,將結果返回給JS層。內容將被寫入nativeToJsMessageQueue隊列中。

callBack.sendPluginResult(new PluginResult(PluginResult.Status.OK,autoInit));

(2) HmsInstanceId消息調用

在HmsPush.js中通過runHmsInstance接口將消息轉給Android平臺,通過異步調用方式,平臺將結果通過Promise返回。

消息將會轉到HmsPushInstanceId類中,在HmsPushInstanceId的execute函數(shù)中,根據(jù)各功能不同,轉向不同的函數(shù)處理。

public void execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
    if (!action.equals("init"))
        hmsLogger.startMethodExecutionTimer(action);
 
    switch (action) {
        case "init":
            Log.i("HMSPush", "HMSPush initialized ");
            break;
        case "enableLogger":
            enableLogger(callbackContext);
            break;
        case "disableLogger":
            disableLogger(callbackContext);
            break;
        case "getToken":
            getToken(args.length() > 1 ? args.getString(1) : Core.HCM, callbackContext);
            break;
        case "getAAID":
            getAAID(callbackContext);
            break;
        case "getCreationTime":
            getCreationTime(callbackContext);
            break;

最后同樣使用設置結果的方式,將結果返回給JS層。內容將被寫入nativeToJsMessageQueue隊列中。

callBack.sendPluginResult(new PluginResult(PluginResult.Status.OK,autoInit));

過程與HmsPushMessaging非常相似。主要區(qū)別在于HmsPushInstanceId用于映射HmsInstanceId相關的接口,HmsPushMessaging用于映射HmsMessaging相關接口。

(3)  localNotification消息調用

在HmsLocalNotification.js中通過run接口將消息傳遞給Android平臺,通過異步調用方式,平臺將結果通過Promise返回。

消息將會轉到HmsLocalNotification類中,在HmsLocalNotification的execute函數(shù)中,根據(jù)各功能不同,轉向不同的函數(shù)處理。

public void execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
    switch (action) {
        case "localNotification":
            localNotification(args, callbackContext);
            break;
        case "localNotificationSchedule":
            localNotificationSchedule(args.getJSONObject(1), callbackContext);
            break;
        case "cancelAllNotifications":
            cancelAllNotifications(callbackContext);
            break;
        case "cancelNotifications":
            cancelNotifications(callbackContext);
            break;
        case "cancelScheduledNotifications":
            cancelScheduledNotifications(callbackContext);
            break;
        case "cancelNotificationsWithId":
            cancelNotificationsWithId(args.getJSONArray(1), callbackContext);
            break;

同樣會通過sendPluginResult接口返回處理結果。但是localNotification的消息涉及消息發(fā)送,會在發(fā)送完成后進行消息返回。

(4)  Push事件回調

在Push消息中除了函數(shù)調用外,還有很多的事件監(jiān)聽,比如收到普通消息,收到透傳消息,收到Token等,因此在Push中還有對于各種事件的監(jiān)聽。

對于回調流程的介紹從Android側開始。

在Android側,Push回調消息的函數(shù)定義在HmsPushMessageService.java中。

根據(jù)SDK的要求,復寫需要用到的回調函數(shù):onMessageReceived,onDeletedMessages,onNewToken等。

當事件被觸發(fā)時,會向JS層發(fā)送事件通知:

public static void runJS(final CordovaPlugin plugin, final String jsCode) {
    if (plugin == null)
        return;
    Log.d(TAG, "runJS()");
 
    plugin.cordova.getActivity().runOnUiThread(() -> {
        CordovaWebViewEngine engine = plugin.webView.getEngine();
        if (engine == null) {
            plugin.webView.loadUrl("javascript:" + jsCode);
 
        } else {
            engine.evaluateJavascript(jsCode, (result) -> {
 
            });
        }
    });
}

JS側的監(jiān)聽定義:

在HmsPushEvent.js中對每個事件都進行了定義及注冊

exports.REMOTE_DATA_MESSAGE_RECEIVED = "REMOTE_DATA_MESSAGE_RECEIVED";
exports.TOKEN_RECEIVED_EVENT = "TOKEN_RECEIVED_EVENT";
exports.ON_TOKEN_ERROR_EVENT = "ON_TOKEN_ERROR_EVENT";
exports.NOTIFICATION_OPENED_EVENT = "NOTIFICATION_OPENED_EVENT";
exports.LOCAL_NOTIFICATION_ACTION_EVENT = "LOCAL_NOTIFICATION_ACTION_EVENT";
exports.ON_PUSH_MESSAGE_SENT = "ON_PUSH_MESSAGE_SENT";
exports.ON_PUSH_MESSAGE_SENT_ERROR = "ON_PUSH_MESSAGE_SENT_ERROR";
exports.ON_PUSH_MESSAGE_SENT_DELIVERED = "ON_PUSH_MESSAGE_SENT_DELIVERED";
function onPushMessageSentDelivered(result) {
  window.registerHMSEvent(exports.ON_PUSH_MESSAGE_SENT_DELIVERED, result);
}
exports.onPushMessageSentDelivered = onPushMessageSentDelivered;

需要注意的是,這里的定義需要在應用開發(fā)時主動調用,否則不會生效。可以參考Demo中的eventListeners.js。

如果發(fā)現(xiàn)已經在Java側觸發(fā)回調,但是沒有接收到,就需要檢查一下Cordova中是否定義有相關調用事件。

這樣,在Android側觸發(fā)事件時,JS側就可以收到并處理相關的消息了。如果需要增加新的事件,也可以參考該流程。

小結

通過以上的方式,Push插件實現(xiàn)了JS側-Java側的消息互通。在大部分的服務函數(shù)接口調用中都采用的類似形式。但是對于某些服務,如廣告、地圖等需要顯示圖片或視頻的場景(如地圖,原生廣告等),會用到其他的方式,使用上也更復雜一些,這些會在其他的文檔中做詳細的介紹。

>>訪問HMS Core官網(wǎng),了解更多相關內容
>>獲取HMS Core Cordova插件開發(fā)指導文檔
>>華為HMS Core官方論壇
>>華為HMS Core Cordova插件開源倉庫地址:GitHub

以上就是Cordova插件如何實現(xiàn)JavaScript與Java的通信的詳細內容,更多關于Cordova插件JavaScript與Java通信的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解基于深度學習的兩種信源信道聯(lián)合編碼

    詳解基于深度學習的兩種信源信道聯(lián)合編碼

    信源編碼是一個數(shù)據(jù)壓縮的過程,其目的是盡可能地將信源中的冗余度去掉;而信道編碼則是一個增加冗余的過程,通過適當加入冗余度來達到抵抗信道噪聲,保護傳輸數(shù)據(jù)的目的。
    2021-05-05
  • 怎樣制作“別人家的”Chrome插件

    怎樣制作“別人家的”Chrome插件

    Chrome插件有很多實用API可以讓我們使用,通過Chrome插件我們還可以做很多的事情,例如翻譯網(wǎng)頁文字等。本文將教你怎樣制作“別人家的”Chrome插件,感興趣的小伙伴一起來看看吧
    2021-08-08
  • 匯編優(yōu)化提示

    匯編優(yōu)化提示

    暑假瞄了一些匯編優(yōu)化的文章,感覺這篇有點意思。盡管英文水平不咋地,還是倔起牛勁翻譯了下??隙ㄓ胁缓玫牡胤剑蠹液:瓇英文原文附件給出~如果有什么錯誤還望批評指正~另外,如果admin感覺可以加精的話就麻煩下了
    2012-07-07
  • 內存溢出和內存泄漏的詳解及區(qū)別

    內存溢出和內存泄漏的詳解及區(qū)別

    這篇文章主要介紹了內存溢出和內存泄漏的詳解及區(qū)別的相關資料,需要的朋友可以參考下
    2017-03-03
  • Idea 無法引用類問題解決辦法

    Idea 無法引用類問題解決辦法

    這篇文章主要介紹了 Idea 無法引用類問題解決辦法的相關資料,需要的朋友可以參考下
    2017-03-03
  • 權限控制之粗粒度與細粒度概念及實現(xiàn)簡單介紹

    權限控制之粗粒度與細粒度概念及實現(xiàn)簡單介紹

    這篇文章主要介紹了權限控制之粗粒度與細粒度概念及實現(xiàn)簡單介紹,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Windows API函數(shù)大全(完整)

    Windows API函數(shù)大全(完整)

    Windows API函數(shù)大全,從事軟件開發(fā)的朋友可以參考下
    2012-05-05
  • 10 款珍藏已久的 Chrome 瀏覽器插件(程序員必裝)

    10 款珍藏已久的 Chrome 瀏覽器插件(程序員必裝)

    Chrome 瀏覽器有一個好處,就是插件極其豐富,只有你想不到的,沒有你找不到的,這恐怕是 Chrome 瀏覽器被眾多愛好者鐘愛的原因吧。今天給大家分享這些插件太強了,Chrome 必裝!尤其程序員
    2021-03-03
  • 作為程序員必須了解的縮寫和專業(yè)名詞

    作為程序員必須了解的縮寫和專業(yè)名詞

    這篇文章主要介紹了作為程序員必須了解的縮寫和專業(yè)名詞,文中講解非常詳細,對想學編程的朋友有所幫助,感興趣的可以了解下
    2020-07-07
  • 8個基于Lucene的開源搜索引擎(推薦)

    8個基于Lucene的開源搜索引擎(推薦)

    Lucene是一種功能強大且被廣泛使用的搜索引擎,以下列出8種基于Lucene的搜索引擎,你可以想象他們有多么強大
    2017-04-04

最新評論