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

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

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

2019-11-09 14:14:53
字體:
來源:轉載
供稿:網友

關于在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
成人福利免费观看| 亚洲电影在线看| 欧美成人激情视频免费观看| 日韩中文字幕在线看| 欧美日韩亚洲成人| 在线播放日韩专区| 中文字幕日韩欧美| 综合激情国产一区| 成人国产在线激情| 国产精品美女久久久免费| 在线精品视频视频中文字幕| 国产精品视频精品视频| 久久综合色88| 欧美精品久久久久久久久久| 国产精品视频xxx| 欧美精品在线看| 久久久久久久激情视频| 精品久久久久久久久久ntr影视| 精品国偷自产在线视频99| 亚洲精品日产aⅴ| 欧美人与物videos| 国产在线播放91| 欧美大片欧美激情性色a∨久久| 亚洲欧美日韩中文在线制服| 精品久久久999| 2019中文字幕在线免费观看| 国产精品久久久久久超碰| 国产视频在线观看一区二区| 最近2019年好看中文字幕视频| 亚洲精品有码在线| 欧美亚洲成人xxx| 国产91成人在在线播放| 97香蕉久久超级碰碰高清版| 国产精品扒开腿做| 26uuu久久噜噜噜噜| 国产精品伦子伦免费视频| 欧美日韩免费区域视频在线观看| 一本色道久久综合亚洲精品小说| 国产成人精品在线播放| 精品久久久久久久久中文字幕| 欧美尺度大的性做爰视频| 亚洲免费中文字幕| 97精品国产97久久久久久春色| 日韩av在线资源| 成人午夜在线影院| 精品人伦一区二区三区蜜桃免费| 精品亚洲一区二区三区在线播放| 国产欧亚日韩视频| 亚洲老头同性xxxxx| 国产一区二区三区四区福利| 国产成人福利夜色影视| 国产精品欧美日韩一区二区| 97视频免费观看| 久久免费视频在线| 国产精品成熟老女人| 日韩黄在线观看| 日韩av在线资源| 欧美日韩激情美女| 亚洲精品美女在线| 欧美精品国产精品日韩精品| 成人444kkkk在线观看| 国产精品女人网站| 国产精品入口夜色视频大尺度| 国产自产女人91一区在线观看| 久久精品欧美视频| 欧美大尺度激情区在线播放| 欧美成人免费va影院高清| 亚洲国产成人一区| 国产视频久久久久久久| 国产精品久久久久免费a∨| 国产不卡精品视男人的天堂| 国产情人节一区| 亚洲3p在线观看| 久久久久久欧美| 欧美又大粗又爽又黄大片视频| 久久久久久国产精品| 日韩美女免费视频| www.日本久久久久com.| 国内精品免费午夜毛片| 在线亚洲男人天堂| 日韩成人小视频| 中文字幕精品一区久久久久| 久久频这里精品99香蕉| 成人免费视频网址| 欧美一区二区三区四区在线| 一区二区欧美激情| 亚洲美女又黄又爽在线观看| 在线看国产精品| 日韩欧中文字幕| 久久久久久中文字幕| 欧洲成人午夜免费大片| 欧美亚洲国产另类| 国产精品国产三级国产aⅴ浪潮| 欧美久久久精品| 欧美国产视频日韩| 日韩av一区二区在线| 亚洲另类欧美自拍| 国产欧美一区二区三区视频| 成人欧美在线视频| 久久在线观看视频| 亚洲国产私拍精品国模在线观看| 亚洲精品综合久久中文字幕| 在线日韩第一页| 中日韩美女免费视频网址在线观看| 久热精品视频在线| 国产精品揄拍一区二区| 亚洲片av在线| 亚洲国产高清福利视频| 久久久伊人欧美| 欧美成人自拍视频| 精品成人国产在线观看男人呻吟| 国产精品毛片a∨一区二区三区|国| 成人动漫网站在线观看| 一区二区福利视频| 亚洲热线99精品视频| 日韩精品在线观看网站| 97在线观看免费高清| 亚洲老头同性xxxxx| 精品人伦一区二区三区蜜桃网站| 国产精品视频男人的天堂| 亚洲午夜国产成人av电影男同| 亚洲视频专区在线| 欧美放荡办公室videos4k| 欧美大片欧美激情性色a∨久久| 色妞色视频一区二区三区四区| 日韩在线观看免费高清完整版| 亚洲人成77777在线观看网| 亚洲永久在线观看| 国产一区二区三区网站| 精品久久久久国产| 欧美老女人性生活| 国产视频精品xxxx| 亚洲影视九九影院在线观看| 欧美日韩福利电影| 精品中文字幕在线2019| 色爱精品视频一区| 国产精品视频网站| 日韩毛片在线看| 91国语精品自产拍在线观看性色| 国产精品视频1区| 亚洲国产精品99| 日韩精品免费在线观看| 亚洲韩国青草视频| 亚洲香蕉在线观看| 2019国产精品自在线拍国产不卡| 久久天天躁狠狠躁夜夜av| 欧美电影在线免费观看网站| 日韩国产在线播放| 亚洲欧洲高清在线| 精品国产一区二区三区四区在线观看| 久久国产精品影片| 国产精品入口夜色视频大尺度| 亚洲第一级黄色片| 青青青国产精品一区二区| 国产欧美在线视频| 日本精品性网站在线观看| 亚洲人成自拍网站| 51久久精品夜色国产麻豆| 日本久久久久久久久久久| 国产精品xxxxx| 欧美一区亚洲一区| 日韩av有码在线| 欧美精品激情在线观看| 91在线网站视频|