Статьи

31 день Windows 8 для HTML5 | День № 29: PLM

Эта статья посвящена Дню № 29 из 31-й серии Windows 8 . Каждая из статей этой серии будет опубликована как для HTML5 / JS, так и для XAML / C # . Вы можете найти дополнительные ресурсы, загрузки и исходный код на нашем сайте .ProcessLifecycleManagement

Через 29 дней мы, наконец, поговорим об управлении жизненным циклом приложений или процессами (PLM). Теперь, прежде чем закрыть браузер, подумайте, что я пропущу этот, пожалуйста, не надо. Мы поговорим о том, как будет работать ваше приложение, когда оно будет запущено, и какие события нам нужно подключить. В конечном итоге мы смотрим на управление различными состояниями, в которых наше приложение может находиться на устройстве пользователя. Вот иллюстрация (изображение из MSDN ):

29XAMLLifecycleDiagram_thumb1

Как веб-разработчики, этот жизненный цикл процесса может показаться нам чуждым. Конечно, наши веб-приложения и \ или сайты имеют жизненный цикл, но наше слово — это мир без состояния. Сказав это, нам всегда приходилось сталкиваться с перебоями между серверами, волатильностью сети и общим управлением сессиями. Те же принципы в некоторой степени верны в нашем родном приложении. Windows говорит о том, когда нам жить, и мы должны быть к этому готовы.

Причина, по которой это важно для нас как разработчиков приложений для Windows 8, заключается в том, что мы хотим обеспечить бесперебойную работу пользователей в наших приложениях. Когда пользователь нажимает клавишу Windows на своем компьютере и покидает ваше приложение, вы хотите убедиться, что вы каким-то образом сохранили или сохранили его данные, чтобы, когда они вернутся, они все еще были там.

Я думал, что Windows обрабатывает это автоматически?

Да и нет. По умолчанию, если вы запускаете приложение Windows 8, оставляете его и возвращаетесь, оно автоматически будет именно там, где вы его оставили. Однако, если вы оставите его, а затем откроете еще 6 или 7 приложений, вполне вероятно, что операционная система приостановит ваше приложение или даже завершит его. К счастью, есть несколько отличных механизмов, которые мы можем использовать для управления этим.

Признание вашего приложения было приостановлено

Согласно Microsoft, «приложение может быть приостановлено, когда пользователь от него отключается, * или *, когда Windows переходит в состояние низкого энергопотребления. Большинство приложений перестают работать, когда пользователь отключается от них ». Есть несколько вещей, которые вы должны знать о том, как ваше приложение окажется в приостановленном состоянии:

  • Ваше приложение может быть приостановлено. Для простого приложения, которое я создал для этой статьи, я никогда не видел, чтобы оно само входило в приостановленное состояние.
  • Как правило, когда в системе заканчиваются ресурсы, это время, когда ваше приложение перейдет в состояние ожидания.
  • Когда вы оставляете приложение для использования другого, Windows будет ждать несколько секунд, прежде чем приостановить его, на тот случай, если вы планируете быстро вернуться к нему.

Итак, если вы чем-то похожи на меня, вы, вероятно, задаетесь вопросом, как мы собираемся писать и тестировать некоторый код, который происходит только тогда, когда Windows захочет сделать это. К счастью, для этого есть несколько инструментов.

Теперь, чтобы поговорить обо всем этом на протяжении всего жизненного цикла, я намеренно перебираю вещи несколько назад, это будет иметь больше смысла, когда мы перейдем к разговору о том, что происходит при запуске нашего приложения. Скорее всего, вы начали разработку приложения с одного из шаблонов Visual Studio. Если это так, то вы увидите кучу стандартного кода в вашем файле default.js. Этот стандартный код — в основном некоторые из простых ловушек для PLM, а также для запуска вашего приложения.

Прежде чем наше приложение перейдет в другое состояние, будет вызвано событие oncheckpoint . Это * уникальная возможность (не единственная, которую вы всегда можете сохранить) для вас, например, сохранить состояние сеанса пользователя или что-то вроде его истории навигации.

app.oncheckpoint = function (args) {
    args.setPromise(finishOff());
};

function finishOff() {
    return new WinJS.Promise(function (complete, cancel, progress) {
        WinJS.log && WinJS.log("app.oncheckpoint called.", "31 days", "status");
        complete();
    });
}

Глядя на код выше, вы можете видеть, что мы создали функцию, которая в свою очередь будет выполняться при срабатывании события контрольной точки. В нашем коде мы создаем обещание, которое, в свою очередь, сообщит Windows, что происходит некоторая асинхронная активность, и вещи не должны заканчиваться до тех пор, пока не будет вызвано complete. Сказав это, Windows также не собирается ждать вечно. Windows подождет несколько секунд (я полагаю, 5 секунд), прежде чем скажет: «Извини, чувак, я не в порядке, ты просто надеешься долго».

В WinJS есть объект с именем sessionState . Этот объект sessionState является отличным местом для хранения некоторых данных ваших сессий пользователей, таких как история навигации (как фактически делает шаблон навигации). Прелесть этого объекта sessionState в том, что Windows фактически будет управлять сохранением и воссозданием этого объекта и связанных с ним данных. Хотя для нас меньше работы, нам все равно придется брать данные из этого объекта и, при необходимости, заново создавать свои собственные объекты.

Контрольная точка вызывается, когда ваше приложение будет приостановлено. Если ваше приложение приостановлено, вы больше не будете получать уведомлений, так что это место, где можно заняться делом, пока у вас есть шанс.

Признавая, что ваше приложение возобновляет работу

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

var webUI = Windows.UI.WebUI.WebUIApplication;

webUI.addEventListener("resuming", onResume, false);

function onResume() {
    WinJS.log && WinJS.log("app resuming", "31 days", "status");
}

На старте

Это где все может быть немного сложнее. В приведенном ниже коде я перечислил все различные состояния выполнения и записал это в окно консоли. Так же, как мы делали с пустым приложением в первый день , это дает нам некоторую историю относительно того, когда эти вещи будут запущены и еще много чего. Это наше место, где мы можем делать такие вещи, как воссоздание объектов в зависимости от состояния, в котором находились приложения (если мы, конечно, заботимся).

var app = WinJS.Application;

app.onactivated = function (args) {
    WinJS.log && WinJS.log("app.onactivated", "31 days", "status");

    if (args.detail.kind === activation.ActivationKind.launch) {
        WinJS.log && WinJS.log("Activation Kind === Launch.", "31 days", "status");

        switch (args.detail.previousExecutionState) {

            case activation.ApplicationExecutionState.terminated:
                WinJS.log && WinJS.log("previousExecutionState terminated", "31 days", "status");
                break;

            case activation.ApplicationExecutionState.running:
                WinJS.log && WinJS.log("previousExecutionState running", "31 days", "status");
                break;

            case activation.ApplicationExecutionState.suspended:
                WinJS.log && WinJS.log("previousExecutionState suspended", "31 days", "status");
                break;

            case activation.ApplicationExecutionState.closedByUser:
                WinJS.log && WinJS.log("previousExecutionState closedByUser", "31 days", "status");
                break;

            case activation.ApplicationExecutionState.notRunning:
                WinJS.log && WinJS.log("previousExecutionState notRunning", "31 days", "status");
                break;
        }

        args.setPromise(WinJS.UI.processAll());
    }
};

Чтобы посмотреть на конкретный пример этого. Мы не можем смотреть дальше, чем шаблон приложения навигации, найденный внутри Visual Studio. Здесь мы увидим не только то, что мы сохраняем нашу историю навигации на контрольной точке в объекте sessionState, но когда наше приложение запускается, мы проверяем, что мы 1. восстановим его, а также переместим их обратно в место, где они остановились.

app.addEventListener("activated", function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
        } else {
        }

        if (app.sessionState.history) {
            nav.history = app.sessionState.history;
        }
        args.setPromise(WinJS.UI.processAll().then(function () {
            if (nav.location) {
                nav.history.current.initialPlaceholder = true;
                return nav.navigate(nav.location, nav.state);
            } else {
                return nav.navigate(Application.navigator.home);
            }
        }));
    }
});

app.oncheckpoint = function (args) {
    app.sessionState.history = nav.history;
};

Теперь, как в мире я тестирую этот материал PLM?

Поскольку это сложный сценарий, который должен реализоваться автоматически, в Visual Studio есть инструменты, которые позволяют нам моделировать эти состояния в нашем приложении. Во-первых, убедитесь, что вы открыли панель инструментов Debug Location в Visual Studio.

29-XAML-DebugLocation

После того, как вы добавили эту панель инструментов, это так же просто, как выбрать один из этих трех вариантов:

29-XAML-Приостановить

  • Приостановка немедленно переведет вашу заявку в приостановленное состояние. Это также вызовет ваш обработчик приостановленных событий, прежде чем он перестанет работать.
  • Resume , очевидно, вернет ваше приложение из приостановленного состояния. Если ваше приложение не приостановлено, ничего не произойдет.
  • Приостановка и завершение работы имитируют то, что происходит, когда Windows завершает работу вашего приложения. Сначала будет приостановлено состояние, после чего произойдет полное отключение вашего приложения.

Резюме

Короче говоря, мы хотим обеспечить беспроблемную работу для наших пользователей, поэтому помните об уроках этой статьи. Не переусердствуйте, хотя. Сохранение несохраненных данных для пользователя — это удобство, поэтому, если вы считаете, что это будет важно, не пытайтесь предвидеть все, что может понадобиться пользователю. Также помните о производительности, я не думаю, что мы хотим сохранять на диске хоть один раз, когда символ меняется в текстовом поле.

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

Если вы хотите загрузить мой рабочий образец, использующий код из этой статьи, нажмите значок ниже:

downloadHTML

Завтра пришло время отправлять твои крутые вещи в магазин. Увидимся позже!

downloadTheTools