亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Cordova插件開發之自定義消息事件addEventListener,fireWindowEvent

2019-11-09 15:17:08
字體:
來源:轉載
供稿:網友

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

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

 

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

 

 

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

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

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

 

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

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

 

這里顯然就是典型的回調機制,就是在自己的工程里定制消息的響應回調函數,然后當產生這個消息的話,回調函數就會被調用。

那么接下來看一下這個電池狀態插件是怎樣實現的。

 

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代碼和硬件本地代碼聯系起來。

整個插件的工作原理是:

 

1. 定義自定義消息

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

3. 本地產生消息,通過exec函數指定的回調函數來響應。,然后在相應函數里,激發自定義消息。(fireWindowEvent)

4. 接聽者收到消息和參數

 

其中自定義消息部分是:

// 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;    }};

 

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

 

 

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

/** * 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", []);  }};

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

 

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黑人极品videos精品欧美裸| 久久久999成人| 午夜精品一区二区三区在线视频| 国产精品一区二区三区久久| 成人免费xxxxx在线观看| 久久亚洲精品毛片| 亚洲三级黄色在线观看| 亚洲精品一区二区网址| 国产精品一区二区久久精品| 国产亚洲日本欧美韩国| 中文字幕成人精品久久不卡| 欧美影院成年免费版| 欧美亚洲另类激情另类| 国产美女91呻吟求| 亚洲欧美国产视频| 国产精品日韩在线播放| 欧美丰满少妇xxxxx| 亚洲综合成人婷婷小说| 久久久国产一区二区| 亚洲免费一在线| 国产成人亚洲综合| 亚洲精选在线观看| 亚洲黄色有码视频| 国内精品久久久久| 美女福利精品视频| 欧美在线观看网址综合| 亚洲自拍偷拍在线| 免费不卡欧美自拍视频| 亚洲精品久久久久中文字幕欢迎你| 亚洲一区二区在线播放| 国产福利视频一区二区| www.日韩.com| 国产午夜精品全部视频在线播放| 97超级碰碰人国产在线观看| 国内精品久久久久久久| 欧美电影电视剧在线观看| 欧洲中文字幕国产精品| 亚洲自拍在线观看| 国产一区二区三区四区福利| 97视频在线观看视频免费视频| 国产精品国内视频| 一本色道久久88精品综合| 欧美视频在线免费看| 伊人一区二区三区久久精品| 日韩欧美中文字幕在线观看| 都市激情亚洲色图| 日本免费在线精品| 欧美黄色片免费观看| 日韩精品视频在线免费观看| 中文字幕一区二区三区电影| 国产欧美精品久久久| 亚洲性猛交xxxxwww| 精品福利在线看| 色综合老司机第九色激情| 91精品国产综合久久久久久久久| 欧美精品videos性欧美| 亚洲精品第一国产综合精品| 亚洲性无码av在线| 在线观看欧美视频| 国产一区二区三区高清在线观看| 精品亚洲国产成av人片传媒| 日韩中文综合网| 欧美激情网站在线观看| 中文字幕亚洲精品| 日韩av在线免费观看| 欧美成人午夜激情视频| 中文字幕日韩精品在线| 欧美成人激情视频免费观看| 亚洲欧洲午夜一线一品| 亚洲精品一区二三区不卡| 亚洲电影免费观看高清完整版在线观看| 91国内在线视频| 欧美理论片在线观看| 亚洲午夜精品久久久久久性色| www.亚洲免费视频| 1769国产精品| 国产精品国模在线| 精品成人国产在线观看男人呻吟| 一本色道久久综合狠狠躁篇怎么玩| 欧美成人黑人xx视频免费观看| 亚洲国产私拍精品国模在线观看| 在线精品国产成人综合| 欧美壮男野外gaytube| 日韩大陆欧美高清视频区| 成人精品视频在线| 亚洲经典中文字幕| 国产欧美在线观看| 国内精品国产三级国产在线专| 久久99国产精品久久久久久久久| 国产精品吹潮在线观看| 国产一级揄自揄精品视频| 一区二区三区日韩在线| 国产精品美女免费| 日韩国产精品视频| 国语自产精品视频在线看一大j8| 亚洲一区二区三区sesese| 亚洲第一网站免费视频| 精品久久久久久久久久久| 久久久精品国产一区二区| 8x海外华人永久免费日韩内陆视频| 国产精品美女主播在线观看纯欲| 欧美在线欧美在线| 国产精品成久久久久三级| 欧美猛交ⅹxxx乱大交视频| 亚洲理论片在线观看| 亚洲精品久久久久久久久| 国产又爽又黄的激情精品视频| 一区二区三区精品99久久| 日韩精品视频免费在线观看| 亚洲男人天堂2023| 国产成+人+综合+亚洲欧美丁香花| 久久精品视频va| 国产97在线视频| 黑人巨大精品欧美一区免费视频| 97成人超碰免| 亚洲精品视频网上网址在线观看| 欧美激情精品久久久| 国产一区二区在线播放| 成人黄在线观看| 国产精品久久久久免费a∨大胸| 亚洲精品久久7777777| 不卡中文字幕av| 色婷婷综合久久久久| www国产91| 色综合久久中文字幕综合网小说| 亚洲激情小视频| 久久久久久尹人网香蕉| 亚洲成人网在线观看| 91亚洲精品久久久久久久久久久久| 国产午夜精品一区二区三区| 国产精品香蕉国产| 久久激情视频久久| 亚洲成人亚洲激情| 久久久久久久久久久成人| 精品国产欧美一区二区五十路| 91精品国产综合久久香蕉的用户体验| 亚洲国产精品嫩草影院久久| 色yeye香蕉凹凸一区二区av| 久久九九热免费视频| 国产丝袜视频一区| 久久久久久久91| 亚洲japanese制服美女| 欧美成人免费va影院高清| 91久久久亚洲精品| 欧美日韩在线观看视频小说| 亚洲国产一区二区三区在线观看| 亚洲视频欧洲视频| 日韩av免费观影| 九九热r在线视频精品| 日本欧美一级片| 欧美最猛黑人xxxx黑人猛叫黄| 日韩亚洲国产中文字幕| 国产精品日本精品| 亚洲成年人在线播放| 日韩免费不卡av| 久久韩剧网电视剧| 日韩精品免费在线观看| 久久99精品久久久久久青青91| 色婷婷**av毛片一区| 国产亚洲精品高潮| 综合激情国产一区| 国产999精品视频| 国产精品va在线播放我和闺蜜| 成人看片人aa|