Разработка приложений для Modern UI: Windows 8

Использование контрактов и жизненный цикл приложения

Показывать лекцию целиком

Цель изучения

Материалы к модулю Вы можете скачать здесь.

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

Начало

Вам понадобится результат работы в предыдущем модуле, который находится в папке \Module_8_Assets\Starter

Контракты

Приложения описывают контракты, чтобы сообщить Windows о том, какую функциональность они поддерживают. Контракты также позволяют приложениям использовать функционал друг друга: например, приложение для обработки текста может воспользоваться контрактом общего доступа (Share Contract), чтобы передать какой-либо текст приложению для работы с электронной почтой.

Модель WinRT-приложений предоставляет интерфейс, позволяющий использовать такие стандартные функции, как Поиск, Общий доступ и Параметры. Эти функции представлены в виде чудо-кнопок на соответствующей панели.

Чтобы отобразить панель чудо-кнопок, необходимо выполнить одно из следующих действий: провести пальцем от правого края экрана на устройстве с сенсорным экраном, либо на клавиатуре нажать Win+C, либо переместить указатель мыши в правый нижний угол экрана.

Упражнение: использование чудо-кнопок

Рассмотрим как работает эта технология при передаче (sharing) веб-страницы по электронной почте с использованием Windows-приложений Internet Explorer и Mail (Почта).

  • На начальном экране выберите плитку Internet Explorer.
  • Введите адрес сайта, например, www.microsoft.com
  • Вызовите панель чудо-кнопок, как было описано ранее (проведя от правого края экрана на устройстве с тач-скрином, либо нажав Winkey+C, либо переместив указатель мыши в правый нижний угол экрана).
  • Из появившегося меню выберите Общий доступ (Share).

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

  • Выберите приложение для работы с электронной почтой. Адрес из Inernet Explorer будет готов к отправке в новом электронном письме.
  • Контракты

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

    Контракты и расширения в приложениях
    App to App Picking contract Контракт передачи из приложения в приложение
    AutoPlayАвтозапуск
    Background tasksФоновые задачи
    Cached file updaterКонтракт обновления кэшированных файлов
    Camera settingsПараметры камеры
    Contact pickerОкно выбора контактов
    File activationАктивация файла
    Game installerПроводник игр
    Play To contractКонтракт "Воспроизведение на устройстве"
    Print task settingsПараметры задачи печати
    Protocol activationАктивация протокола
    Search contractКонтракт "Поиск"
    Settings contractКонтракт "Параметры"
    Share contractКонтракт "Общий доступ"
    Account Picture ProviderПоставщик аватаров
    SSL/certificatesSSL/сертификаты

    Чтобы узнать больше о контрактах и расширениях, посетите сайт

    http://msdn.microsoft.com/en-us/library/windows/apps/hh464906.aspx

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

    Контракт "Поиск" (Search) позволяет с помощью кнопки поиска из панели чудо-кнопок, давать пользователю возможность осуществлять поиск по информации в вашем приложении (в этом модуле вы добавите контракт "Поиск" к приложению из примера).

    Контракт "Параметры" (Settings) позволяет приложению вывести на экран свое окно настроек (предпочтений пользователя и т.д.) по нажатию на кнопку Параметры (Settings) в панели чудо-кнопок.

    Контракт "Общий доступ" (Share) позволяет вашему приложению интегрироваться с дополнениями совместного использования. В результате ваше приложение может обмениваться данными (адресами сайтов, текстом и т.д.) с другими приложениями.

    Упражнение: Объявление контрактов

    Контракты объявляются в манифесте приложения. Чтобы их редактировать, можно использовать встроенный редактор Visual Studio.

  • Откройте проект Starter в папке Module_8_Assets\Starter.
  • Дважды кликните на файле манифеста этого приложения, который называется package.appxmanifest.

    Пользовательский интерфейс приложений (Application UI) зависит от настроек значков, ориентации устройства в пространстве и Магазина Windows (Windows Store). Вы узнаете о Магазине Windows подробнее в девятом модуле.

    Возможности ("Capabilities") имеют отношение к работе с сервисами системы и устройствами, о них вы можете узнать в Модуле 6.

  • Откройте вкладку Объявления (Declarations). Здесь вы указываете, какими контрактами будет пользоваться приложение.

    Откройте выпадающее меню Доступные объявления. Появившийся список приведен ниже (он совпадает с таблицей, касающейся контрактов и расширений, рассмотренной выше):

  • Выберите Поиск (Search) из списка и нажмите кнопку Добавить.
  • В следующих упражнениях вы узнаете, как реализовать возможности поиска в коде. А сейчас сохраните манифест package.appxmanifest и закройте редактор манифеста.
  • Упражнение: контракт "Поиск" (Search)

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

  • Откройте JavaScript-файл /js/default.js.
  • Добавьте следующий код подписки на событие после вызова app.start(). В этом коде выполняются следующие действия: получение ссылки на поисковую панель (панель чудо-кнопок), добавление подписчиков на события вызова поискового списка и вызова поисковых подсказок.

    Код доступен в файле \Module_8_Assets\snippets\initialize.txt

    function initialize(args) {
        // reference the Search Pane object and register for handling search 
        var searchPane = Windows.ApplicationModel.Search.SearchPane.getForCurrentView();
    
        // add event listeners for query and suggestions
        searchPane.addEventListener("querysubmitted", handlingQuerySubmitted, false);
        searchPane.addEventListener("suggestionsrequested", 
    handlingSuggestionRequest, false);
    }
    
  • Добавьте код для вызова новой функции инициализации сразу же после комментария TODO в начале файла defult.js:
    // TODO: This application has been newly launched. Initialize
    // your application here.
    initialize(args);
    
  • Затем надо добавить код для обработчиков перечисленных событий. В данном случае воспользуетесь альтернативным методом запроса веб-ресурсов – вместо функции WinJS.xhr используем объект XmlHttpRequest. Код получится чуть более длинный, но вы получите больше возможностей для управления запросом и обработки ответа. В данном примере вы отправите запрос к сервису Wikipedia API, проверите значение ReadyState, которое сообщает об окончании выполнения запроса. Затем обработаете ответ, используя JSON.parse, и заполните список поисковых подсказок заголовками найденных изображений.

    Код примера находится в файле \Module_8_Assets\snippets\queryhandlers.txt

    function handlingQuerySubmitted(e) {
        // Get the latest Data depending on search string
        Data.groupSearch.title = e.queryText;
        Data.getBySearch(Data.groupSearch);
    
        // navigate back to start
        var nav = WinJS.Navigation;
        nav.navigate("/pages/groupeditems/groupedItems.html", null);
    }
    
    function handlingSuggestionRequest(e) {
        handleSuggestionRequest(e.queryText, e.request);
    }
    
    function handleSuggestionRequest(queryText, suggestionRequest) {
        var request = new XMLHttpRequest();
        request.onreadystatechange = function () {
            if (request.readyState === 4) {
                if (request.status >= 200  request.status < 300) {
                    if (request.responseText) {
                        var results = JSON.parse(request.responseText);
                        for (var i in results.query.allimages) {
                            var item = results.query.allimages[i];
                            var title = item.title.replace('File:', '').toString();
    
    if (title) {                     
    suggestionRequest.searchSuggestionCollection.appendQuerySuggestion(title);
                            }
    
                        }
                    }
                } 
            }
        };
        request.open("GET", "http://en.wikipedia.org/w/api.php?action=querylist=allimages
       format=jsonaiprefix=" + queryText + "ailimit=10", false);
        request.send();
    
    
  • Так как вы обращаетесь к функциям getBySearch и groupSearch в пространстве имен Data, необходимо сделать эти функции доступными извне (public). Вставьте выделенные строки, как показано ниже в файл data.js.
    WinJS.Namespace.define("Data", {
        items: groupedItems,
        groups: groupedItems.groups,
        getItemsFromGroup: getItemsFromGroup,
        getItemReference: getItemReference,
        resolveGroupReference: resolveGroupReference,
        resolveItemReference: resolveItemReference,
        addToMyImages: addToMyImages,
        getBySearch: getBySearch,    
        groupSearch: groupSearch    
    
    });
    
  • Запустите приложение. Попробуйте использовать контракт поиска из правой части экрана или нажмите Winkey + C на клавиатуре. Теперь вам доступен поиск и выборка объектов для создания собственной поисковой группы.
  • Жизненный цикл приложения

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

    Чтобы узнать больше, посетите

    http://msdn.microsoft.com/en-us/library/windows/apps/hh464925.aspx и http://blogs.msdn.com/b/windowsappdev/archive/2012/04/10/managing-app-lifecycle-so-your-apps-feel-quot-always-alive-quot.aspx

    Запуск приложения (переход в состояние Running — работающее) происходит по нажатию на значок приложения на начальном экране. Если пользователь переключается на другое приложение, инициализируется событие Suspending (приостановка работы). Обработчик этого события в приложении обычно выполняет действия по сохранению важных данных и информации о состоянии приложения (например, если это браузер, то может быть сохранен адрес веб-страницы, открытой в этот момент).

    Затем приложение переходит в состояние Suspending (ожидание). При этом не используются ресурсы процессора, приложение просто находится в режиме ожидания в фоне. Если пользователь снова переключится на приложение, то инициализируется событие Resuming (возобновление). Обработчик этого события в приложении обычно восстанавливает все важные данные и информацию о состоянии.

    Чаще всего пользователь, переключаясь между приложениями в Windows 8, видит их в том же состоянии, что и до сворачивания, то есть состояние приложения восстанавливается автоматически. Но в некоторых ситуациях система не обладает достаточным объемом памяти, чтобы хранить состояние всех неактивных приложений. В таких ситуациях приложения, которым не хватает памяти, переходят в состояние завершения работы, и им придется самостоятельно восстановить состояние при новом запуске.

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

    Упражнение: обработка событий приостановки и восстановления

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

    Усовершенствуем наше приложение, чтобы решить эту проблему. Для этого добавим обработчики событий приостановки (suspend) и восстановления (resume) .

  • Откройте файл /js/default.js в проекте.
  • Найдите обработчик события app.oncheckpoint, который был добавлен шаблоном Приложение таблицы (Grid App).
  • Найдите комментарий TODO и добавьте выделенный участок кода, как показано ниже. Эта строка сохраняет текущую строку поиска в переменные состояния сессии.
    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. If you need to 
        // complete an asynchronous operation before your application is 
        // suspended, call args.setPromise().
        app.sessionState.history = nav.history;
        app.sessionState.searchText = Data.groupSearch.title;
    };
    
  • В начале файлаdefault.js найдите следующий комментарий TODO и вставьте выделенный текст, как показано ниже. Код обновит результаты поиска, когда приложение будет восстановлено.
    } else {
        // TODO: This application has been reactivated from suspension.
        // Restore application state here.
    
        Data.groupSearch.title = app.sessionState.searchText;
        Data.getBySearch(Data.groupSearch);
    }
    
  • Запустите проект с помощью кнопки F5 или выбрав в меню Отладка/Начать отладку (Debug/Start Debugging).
  • Visual Studio позволяет протестировать, как срабатывает приостановка и восстановление работы приложений с помощью настроек панели инструментов. Попробуйте свернуть (приостановить) приложение, а затем восстановить с помощью списка состояний, как показано на рисунке.
  • Итоги

    Интеграция приложений и панели чудо-кнопок – важная часть работы WinRT-приложений. Чтобы обеспечить такую функциональность, вы должны объявить контракты и добавить код обработчиков событий. Кроме того, приложения, написанные вами по общеизвестной схеме жизненного цикла, удобны для пользователя.

    Самостоятельная работа

    Пройдя по следующей ссылке, вы найдете руководство по интеграции приложения и панели чудо-кнопок. Попробуйте добавить к приложению, разработанному в этом модуле, дополнительные настройки, используя элемент SettingsFlyout (панель параметров): http://msdn.microsoft.com/en-us/library/windows/apps/hh770544.aspx

    Вопросы

  • Вы хотите предоставить некоторые пользовательские настройки в своем приложении, например, установку фонового изображения или настройку перечня избранных элементов. Какой контракт и какая чудо-кнопка вам нужны, чтобы это реализовать?
  • Вы хотите дать пользователю возможность отправлять друзьям ссылки на статьи с помощью электронной почты или приложений для работы с социальными сетями. Как это сделать?
  • Зачем приложению может понадобиться обрабатывать событие checkpoint (проверка состояния) для сохранения состояния? При каких обстоятельствах такое сохранение понадобится?
  • Дополнительные ресурсы

    Чтобы больше узнать об использовании контрактов и жизненном цикле приложений, воспользуйтесь следующими ресурсами.

  • Запуск, возобновление и многозадачность

    http://msdn.microsoft.com/en-us/library/windows/apps/hh770838.aspx

    Рассказывает о том, как обрабатывать события жизненного цикла в собственном приложении, а также как работают фоновые задачи.

  • Контракты и расширения приложений

    http://msdn.microsoft.com/en-us/library/windows/apps/hh464906.aspx

    Обзор всех контрактов и расширений со ссылками к соответствующим статьям и пошаговым руководствам.

  • Добавление контрактов Windows 8 в приложение

    http://blogs.msdn.com/b/windowsappdev/archive/2012/03/23/activating-windows-8-contracts-in-your-app.aspx

    Описывает контракты и показывает, как интегрировать опции поиска и открытия файла в приложение.

  • Ответы

  • Будут использованы чудо-кнопка Параметры (Settings) и контракт "Параметры" (Settings). С их помощью пользователь сможет работать с такими параметрами, как фоновое изображение или избранное.
  • Чтобы добавить такую функциональность, надо использовать контракт "Общий доступ" (Share Contract).
  • Если в системе слишком мало свободной памяти, свернутые приложения могут быть закрыты системой. Когда пользователь захочет вернуться к свернутому и затем закрытому по этой причине приложению, данные о состоянии могут быть восстановлены, если предварительно сохранить их с помощью обработчика события checkpoint.
  • Вернуться к учебному плану