Oct
06

Управление электропитанием (Power Management) в Palm WebOS

В WebOS пользователь может вручную указать интервал, по истечению которого, если устройство не используется, оно переходит в спящий режим. Этот интервал может варьироваться вдиапазоне от 30 секунд до 3х минут.

В некоторых приложениях может возникнуть необходимость держать устройство включенным по истечению интервала, заданного пользователем (это может быть актуально, например, для приложений, воспроизводящих видео или аудио). Для поддержания устройства в активном состоянии в WebOS существует специальный API. О нем и пойдет речь в этот раз.

Итак, нам понадобится тестовое приложение. Создаем проект и в нем сцену main.

app/views/main/main-scene.html

Power Management Test

Сцена содержит виджет для выбора таймаута, в течении которого устройство не должно засыпать, а также кнопки:

  • Переход в активносе состояние
  • Выход из активного состояния
  • Выход из приложения

app/assistants/main-assistant.js

function MainAssistant() {
}

MainAssistant.prototype.setup = function() {
    this.controller.setupWidget("TimeoutPicker",
        {
            modelProperty: 'value',
            label: 'Timeout (minutes)',
            min: 01,
            max: 15,
            padNumbers: true
        },
        this.timeoutModel =
        {
            value: 1
        });
    this.controller.setupWidget("StartActivityButton", {},
        this.startButtonModel = {label: "Start Activity"});
    this.controller.setupWidget("StopActivityButton", {},
        this.stopButtonModel = {label: "Stop Activity", disabled: true});
    this.controller.setupWidget("ExitButton", {}, {label: "Exit"});

    Mojo.Event.listen($(StartActivityButton),
        Mojo.Event.tap, this.onStartActivity.bind(this));
    Mojo.Event.listen($(StopActivityButton),
        Mojo.Event.tap, this.onStopActivity.bind(this));
    Mojo.Event.listen($(ExitButton), Mojo.Event.tap, this.onExit.bind(this));

    this.counter = 0;
}

MainAssistant.prototype.onStartActivity = function(event) {
}

MainAssistant.prototype.onStopActivity = function() {
}

MainAssistant.prototype.onExit = function(event) {
    this.controller.stageController.getAppController().closeAllStages();
    window.close();
}

MainAssistant.prototype.cleanup = function(event) {
    Mojo.Event.stopListening($(StartActivityButton), Mojo.Event.tap, this.onStartActivity);
    Mojo.Event.stopListening($(StopActivityButton), Mojo.Event.tap, this.onStopActivity);
    Mojo.Event.stopListening($(ExitButton), Mojo.Event.tap, this.onExit);
}

В результате получим такой внешний вид приложения:

WebOS Power Management Sample Application

Теперь можно писать логику для обработчиков событий.

Для запуска активного режима приложения необходимо вызвать метод activityStart сервиса palm://com.palm.power/com/palm/power.

MainAssistant.prototype.onStartActivity = function(event) {
    this.counter++;
    this.activity = /* "com.palm.app."  + */
        Mojo.appName + ".activity-" + this.counter;
    this.controller.serviceRequest("palm://com.palm.power/com/palm/power",
    {
         method: "activityStart",
         parameters:
         {
             id: this.activity,
             duration_ms: this.timeoutModel.value * 60 * 1000
         },
         onSuccess: this.activityStartSuccess.bind(this),
         onFailure: this.activityStartFailure.bind(this)
        });
    this.timer = setTimeout(this.onTimer.bind(this),
        this.timeoutModel.value * 60 * 1000 / 2.0);
}

MainAssistant.prototype.onTimer = function(event) {
    if(this.timer)
    {
        clearTimeout(this.timer);
        delete this.timer;
    }
    this.onStopActivity();
}

MainAssistant.prototype.activityStartSuccess = function(event) {
    this.startButtonModel.disabled = true;
    this.stopButtonModel.disabled = false;
    this.controller.modelChanged(this.startButtonModel);
    this.controller.modelChanged(this.stopButtonModel);
    $(info).update("Activity started: " + this.activity);
}

MainAssistant.prototype.activityStartFailure = function(event) {
    $(info).update("Error:
" + Object.toJSON(event)); }

Параметры метода activityStart:

  • id – уникальный идентификатор вызова активного режима (можно использовать формат ID-приложения + ID-операции + счетчик).
  • duration_ms – длительность активного режима в миллисекундах. Максимальное значение єтого параметра 900000, что соответствует 15ти минутам.

Возможные проблемы:

  • На эмуляторе вызов activityStart не дает видимого эффекта. Виртуальная машина остается активной всегда.
  • На официальном форуме разработчиков WebOS-приложений неоднократно появлялась информация о том, что активный режим работает только для системных приложений (с идентификатором, начинающимся на com.palm.app). Также была информация что эту проблему исправили и активный режим доступен для разработчиков сторонних приложений, но без устройства это подтвердить нет никакой возможности.
  • По окончанию активного режима приложение не получает никаких уведомлений, и в случае, когда активный режим завершился, а приложение все еще должно держать устройство включенным, надо перезапускать активный режим заново, указывая новый идентификатор вызова. В таком случае очень удобно пользоваться счетсиком. Для того, чтобы вовремя продлить активный режми, можно использовать таймер.

В примере, вместе с переходом в активный режим, у нас создается таймер, длительность задержки которого равна половине длительности активного режима. При вызове обработчика собфтия таймера, мы выходим из активного режима.

MainAssistant.prototype.onStopActivity = function() {
    if(this.activity)
    {
        this.controller.serviceRequest("palm://com.palm.power/com/palm/power", {
             method: "activityEnd",
             parameters:
             {
                 id: "com.palm.app.news.update-1"
             },
             onSuccess: this.activityStopSuccess.bind(this),
             onFailure: this.activityStopFailure.bind(this)
        });
    }
}

MainAssistant.prototype.activityStopSuccess = function(event) {
    this.startButtonModel.disabled = false;
    this.stopButtonModel.disabled = true;
    this.controller.modelChanged(this.startButtonModel);
    this.controller.modelChanged(this.stopButtonModel);
    $(info).update("Activity stopped: " + this.activity);
    delete this.activity;
}

MainAssistant.prototype.activityStopFailure = function(event) {
    $(info).update("Error:
" + Object.toJSON(event)); } MainAssistant.prototype.onExit = function(event) { this.controller.stageController.getAppController().closeAllStages(); window.close(); }

При выходе из приложения, автоматического останова активного режима не происходит, поэтому в методе cleanup() главной формы все вызовы активного режима должны быть завершены.

MainAssistant.prototype.cleanup = function(event) {
    Mojo.Event.stopListening($(StartActivityButton), Mojo.Event.tap, this.onStartActivity);
    Mojo.Event.stopListening($(StopActivityButton), Mojo.Event.tap, this.onStopActivity);
    Mojo.Event.stopListening($(ExitButton), Mojo.Event.tap, this.onExit);
    this.onStopActivity();
}

На этом все.

Скачать исходный код примера.

Еще интересные посты о программировании для мобильных устройств:

No Comments

Make A Comment

No comments yet.

Comments RSS Feed   TrackBack URL

Leave a comment

Please leave these two fields as-is:
Как Повысить Эрекцию: дженерик левитра. ; Травматолог-Клиника на Калужской - ревматолог. Сообщество Позвоночник и Суставы. ; Где сейчас проходят Акции с подарками и супер скидками ; сиделка

top