麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設計 > 正文

Cordova插件開發(fā)之自定義消息事件addEventListener,fireWindowEvent

2019-11-09 14:14:53
字體:
來源:轉載
供稿:網(wǎng)友

關于在cordova的插件開發(fā)的做定義消息的功能沒有官方的介紹文章,但是官方有一個這樣的例子,就是電源狀態(tài)插件。我們通過學習這個插件的編寫來學習自定義消息。

這個插件的地址為:https://github.com/apache/cordova-plugin-battery-status

 

安裝方法為:cordova plugin add cordova-plugin-battery-status

 

 

使用方法是:在自己的js工程里執(zhí)行以下幾句話:

window.addEventListener("batterystatus", onBatteryStatus, false); function onBatteryStatus(status) {    console.log("Level: " + status.level + " isPlugged: " + status.isPlugged);}

分別是給工程添加插件自定義的消息事件,并指定消息響應函數(shù)

 

在我的測試例子中,使用了如下函數(shù)為兩個按鍵的響應函數(shù),一個訂閱消息,一個取消訂閱:

function onBatteryStatus(info) {  alert("BATTERY STATUS:  Level: " + info.level + "isPlugged: " + info.isPlugged);}$scope.onbatteryStartBtn = function() {  alert("onStartBtn");  window.addEventListener("batterystatus",onBatteryStatus, false);};$scope.onbatteryStopBtn = function() {  alert("onStopBtn");  window.removeEventListener("batterystatus",onBatteryStatus);};

 

 

然后編譯工程:ionic build android

在手機上測試:ionic run android

 

這里顯然就是典型的回調(diào)機制,就是在自己的工程里定制消息的響應回調(diào)函數(shù),然后當產(chǎn)生這個消息的話,回調(diào)函數(shù)就會被調(diào)用。

那么接下來看一下這個電池狀態(tài)插件是怎樣實現(xiàn)的。

 

var cordova = require('cordova'),    exec = require('cordova/exec');var STATUS_CRITICAL = 5;var STATUS_LOW = 20;var Battery = function() {    this._level = null;    this._isPlugged = null;    // Create new event handlers on thewindow (returns a channel instance)    this.channels = {      batterystatus:cordova.addWindowEventHandler("batterystatus"),      batterylow:cordova.addWindowEventHandler("batterylow"),      batterycritical:cordova.addWindowEventHandler("batterycritical")    };    for (var key in this.channels) {        this.channels[key].onHasSubscribersChange= Battery.onHasSubscribersChange;    }};function handlers() {    return battery.channels.batterystatus.numHandlers+        battery.channels.batterylow.numHandlers+        battery.channels.batterycritical.numHandlers;}/** * Event handlers for when callbacks getregistered for the battery. * Keep track of how many handlers wehave so we can start and stop the native battery listener * apPRopriately (and hopefully save onbattery life!). */Battery.onHasSubscribersChange = function() {  // If we just registered the firsthandler, make sure native listener is started.  if (this.numHandlers === 1 && handlers()=== 1) {      exec(battery._status, battery._error,"Battery", "start", []);  } else if (handlers() === 0) {      exec(null, null, "Battery","stop", []);  }};/** * Callback for battery status * * @param {Object} info            keys: level, isPlugged */Battery.prototype._status = function (info) {    if (info) {        if (battery._level !== info.level|| battery._isPlugged !== info.isPlugged) {                        if(info.level === null &&battery._level !== null) {                return; // special casewhere callback is called because we stopped listening to the native side.            }                        // Something changed. Firebatterystatus event            cordova.fireWindowEvent("batterystatus",info);            if (!info.isPlugged) { // donot fire low/critical if we are charging. issue: CB-4520                // note the following areNOT exact checks, as we want to catch a transition from                // above the threshold tobelow. issue: CB-4519                if (battery._level >STATUS_CRITICAL && info.level <= STATUS_CRITICAL) {                    // Fire criticalbattery event                    cordova.fireWindowEvent("batterycritical",info);                }                else if (battery._level >STATUS_LOW && info.level <= STATUS_LOW) {                    // Fire low battery event                    cordova.fireWindowEvent("batterylow",info);                }            }            battery._level = info.level;            battery._isPlugged = info.isPlugged;        }    }};/** * Error callback for battery start */Battery.prototype._error = function(e) {    console.log("Error initializingBattery: " + e);};var battery = new Battery(); // jshint ignore:linemodule.exports = battery;

 

其中,exec(battery._status, battery._error, "Battery","start", []);

用來讓插件的js代碼和硬件本地代碼聯(lián)系起來。

整個插件的工作原理是:

 

1. 定義自定義消息

2. 調(diào)用端增加對自定義消息的接聽(addEventListener)

3. 本地產(chǎn)生消息,通過exec函數(shù)指定的回調(diào)函數(shù)來響應。,然后在相應函數(shù)里,激發(fā)自定義消息。(fireWindowEvent)

4. 接聽者收到消息和參數(shù)

 

其中自定義消息部分是:

// Create newevent handlers on the window (returns a channel instance)    this.channels = {      batterystatus:cordova.addWindowEventHandler("batterystatus"),      batterylow:cordova.addWindowEventHandler("batterylow"),      batterycritical:cordova.addWindowEventHandler("batterycritical")    };    for (var key in this.channels) {        this.channels[key].onHasSubscribersChange= Battery.onHasSubscribersChange;    }};

 

這里共定義了三條消息。格式參考以上格式,

 

 

當有人注冊這個自定義消息的時候會響應以下函數(shù):

/** * Event handlers for when callbacks getregistered for the battery. * Keep track of how many handlers wehave so we can start and stop the native battery listener * appropriately (and hopefully save onbattery life!). */Battery.onHasSubscribersChange = function() {  // If we just registered the firsthandler, make sure native listener is started.  if (this.numHandlers === 1 && handlers()=== 1) {      exec(battery._status, battery._error,"Battery", "start", []);  } else if (handlers() === 0) {      exec(null, null, "Battery","stop", []);  }};

在函數(shù)里執(zhí)行exec函數(shù)來完成插件與本地原生代碼的連接。使用exec函數(shù)調(diào)用原生代碼,然后原始代碼返回結果,在這個例子中,原始代碼保持了返回數(shù)據(jù)的通道,使得,原生代碼一檢測到電量變化,就立馬使用這個保持的通道,來告知插件電量的變化,,然后插件激發(fā)自定義消息,。這樣用戶界面就會收到電量變化的事件。

 

本文僅提供思路與方法,具體定制自定義消息,需要深入閱讀并測試這個插件的源代碼。

插件源碼地址:https://github.com/apache/cordova-plugin-battery-status


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲国产精品久久久久婷婷老年 | 双性帝王调教跪撅打屁股 | 日本一区免费看 | 欧美成人免费在线视频 | 男女牲高爱潮免费视频男女 | 午夜精品毛片 | 亚洲第一页综合 | 久久久久久久久亚洲精品 | 亚洲视频在线网 | 国产免费资源 | 99riav视频一区二区 | 97伦理| 亚洲日本韩国在线观看 | 久久久一区二区三区精品 | 毛片在线视频观看 | 久久精品亚洲一区 | 欧美精品亚洲人成在线观看 | 日韩一级片 | 黑人一区二区 | av电影网站在线观看 | 91精品国产综合久久久动漫日韩 | 国产精品久久久久久久久久东京 | xxx日本视频 | av在线播放免费 | 国产一国产一级毛片视频在线 | 亚洲影视在线观看 | 日韩黄色一级视频 | 中文字幕在线亚洲精品 | 一区二区久久电影 | 欧美十区 | 亚洲第五色综合网 | 97综合| 国产一区二区免费 | 精品中文字幕在线播放 | 97超级碰碰人国产在线观看 | 精品在线一区二区三区 | 国产亚洲美女精品久久久2020 | 久久99深爱久久99精品 | 九色91视频| 鸳鸯谱在线观看高清 | 依依成人精品视频 |