Мы уже рассмотрели, как приложения на ПК с Windows 8 могут взаимодействовать с другими приложениями и веб-службами. При разработке Windows 8 мы выбрали подход, в котором приложения могут быть как источником, так и получателем совместно используемых данных — чем-то вроде буфера обмена с расширенной моделью взаимодействия и более четкой семантикой. Если приложение реализует контракт, Windows 8 обеспечивает связь этого приложения с другими приложениями и самой системой. Вы можете увидеть эту концепцию в действии, воспользовавшись, например, чудо-кнопкой "Общий доступ" на веб-странице, открытой в Internet Explorer в стиле Metro. С помощью этой кнопки вы можете отправить ссылку через приложение "Почта" пользователю, контактные данные которого хранятся в приложении "Люди", и т. д. Вы можете выполнять поиск по приложениям, в которых реализован контракт "Поиск". Вы можете открывать и сохранять файлы в любом расположении, реализующем контракты "Открытие файла" и "Средство выбора файлов". Такой инновационный подход позволяет Windows 8 работать с любой парой "приложение-служба", без необходимости обеспечивать программную поддержку для каждого отдельного приложения. Все эти возможности поддерживаются в вашей учетной записи Майкрософт, которую по вашему выбору можно подключить к различным службам, таким как Facebook, Twitter, LinkedIn и др. На этой неделе мы опубликуем серию статей, посвященных новым приложениям Майкрософт, в которых особое внимание будет уделено совместному доступу, возможностям подключения и интеграции с Windows 8. Эта статья представляет собой повторную публикацию статьи для разработчиков из блога для разработчиков приложений для Windows 8. Автор статьи — Дерек Гебхард (Derek Gebhard), руководитель программы в рабочей группе по взаимодействию с пользователями. — Стивен


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

Платформа активации Windows используется для запуска приложений в стиле Metro и для их уведомления о причине, по которой пользователь запустил их. Причины могут быть самыми разными — от запуска приложения с помощью плитки на начальном экране и до запуска приложения для выполнения конкретной задачи, такой как отображение результатов поиска для запроса. Windows сообщает приложению причину его запуска и по возможности предоставляет дополнительные сведения, необходимые для выполнения задачи. До появления платформы активации Windows 8 вы передавали эти сведения в приложение с помощью параметров командной строки. С помощью своей новой модели мы также поддерживаем передачу активных объектов, таких как StorageFile, ShareOperation и т. п., для предоставления контекста приложению. Вы увидите, что это делает контракты более эффективными. Давайте подробно рассмотрим, что вам необходимо знать для обеспечения поддержки запуска с контрактом.

Контракты: запуск приложений в стиле Metro для конкретной цели и с контекстом

Как можно заметить в ролике о Windows 8 Consumer Preview, контракты Windows 8 представляют собой средство, которое связывает ваше приложение с другими приложениями в стиле Metro и с пользовательским интерфейсом системы. Например, контракт "Средство выбора файлов" позволяет пользователям импортировать файлы из одного приложения в другое. С помощью контракта "Поиск" пользователи получают возможность выполнять поиск приложения из любой части системы и могут быстро передавать запрос между несколькими приложениями. Во всех этих случаях и во многих других сценариях с контрактами операционная система Windows должна иметь возможность выполнить запуск с отображением конкретной области пользовательского интерфейса приложения, чтобы вы могли быстро и эффективно выполнить требуемую задачу. Именно здесь в игру вступает наша платформа активации и наш API.

Пользователи инициируют взаимодействие с приложениями одним из двух указанных ниже способов.

    1. С помощью действия, которое требует полного отображения приложения па переднем плане. Этот способ также называется активацией основного представления. В качестве примера можно привести контракт "Поиск".

      При щелчке приложения на панели поиска оно запускается в представлении результатов поиска.
      Пример активации основного представления
    2. С помощью встроенного действия, не выходя из контекста выполняющегося в данный момент приложения. Этот способ также называется активацией встроенного представления. Ниже приведены два примера — приложение, участвующее в контракте "Средство выбора файлов", и приложение, используемое в качестве получателя данных.

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

Запуск приложения "Почта" с помощью чудо-кнопки "Общий доступ" для предоставления общего доступа к фотографии, с которой я работаю.
Пример активации встроенного представления для приложений-получателей данных

Ниже приведены различия между этими двумя способами.

Активация основного представления

Активация встроенного представления

Полнота представления и запуск в качестве основного приложения на экране

Отрисовка пользовательского интерфейса внутри системного интерфейса

Возможность использования для множества разных задач

Использование для небольшой конкретной задачи с применением ориентированного на нее кода

Отображение в списке переключений

Отсутствие в списке переключений

Возможность закрытия с помощью соответствующего жеста

Отсутствие влияния на представление основного окна для того же приложения

А теперь давайте рассмотрим эти модели активации и применим их к паре распространенных сценариев, которые помогут вам создавать отличные приложения в стиле Metro.

Сценарий 1. Интеграция активации поиска в приложение

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

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

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

Ознакомьтесь с приложениями "Магазин" и "Фотографии". Они является отличным примером выполнения приведенных рекомендаций при обеспечении поддержки активации поиска.

Приложение "Магазин" показано с результатами поиска для слова "calendar" (календарь). Открыта панель поиска, и пользователь вводит новый запрос поиска.

Поиск в приложении "Магазин"

 

Приложение "Фотографии" запущено и отображает результаты поиска для слова "Vancouver" (Ванкувер). Открыта панель поиска с переданным запросом поиска для слова "vancouver".

Поиск в приложении "Фотографии"

Давайте рассмотрим, как вы можете правильно обеспечить поддержку активации поиска в своих приложениях JavaScript и XAML.

Приложения JavaScript

Для приложений JavaScript в стиле Metro активация предоставляется с помощью события WinJS.Application.onactivated. Это событие возникает после завершения DOMContentLoaded, если только приложение уже не запущено или не приостановлено. В противном случае это событие возникает тогда, когда операционной системе Windows требуется активировать приложение. Средства Visual Studio для приложений JavaScript обеспечивают настройку регистрации этого события в файле default.js и предоставляют область для добавления кода, который выполняется при активации общего запуска, то есть когда пользователь запускает приложение с начального экрана.

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

      1. Добавьте объявление поиска в свой манифест, используя конструктор манифестов Visual Studio.
      2. Поместите в глобальную область JavaScript любой код общей инициализации, который должен выполняться при каждом запуске приложения и независимо от причины такого запуска. Если какому-либо коду требуется доступ к модели DOM, добавьте его в обработчик событий DOMContentLoaded.
      3. Выполните регистрацию для обработчика, активируемого для поиска.
      4. Когда приложение активировано для поиска, перейдите на страницу результатов поиска и передайте queryText, полученный из аргументов события активации.

Если вы действуете как я, то вы, вероятно, ищете более простой способ, чем выполнение этой операции вручную. К счастью, вы можете использовать средства Visual Studio для выполнения большей части этой задачи, щелкнув проект правой кнопкой мыши, выбрав команды "Добавить" > "Новый элемент" и выбрав элемент "Контракт "Поиск"" в диалоговом окне. Основная часть приведенного здесь кода и пользовательского интерфейса поиска, отображающего результаты в соответствии с нашими рекомендациями по поиску UX, создается автоматически. Однако с этими средствами следует использовать платформу WinJS.Navigation.

Ниже приведен фрагмент кода из файла default.js для моего приложения "Фотографии", в котором показана поддержка активации поиска:

// Register activated event handler
WinJS.Application.addEventListener("activated", function (eventObject) {
...
if (eventObject.detail.kind === appModel.Activation.ActivationKind.launch) {
...
} else if (eventObject.detail.kind === appModel.Activation.ActivationKind.search) {
uri = searchPageURI;
pageParameters = { queryText: eventObject.detail.queryText };
}
// Indicate to the system that the splash screen must not be torn down
// until after processAll and navigate complete asynchronously.
if (uri) {
eventObject.setPromise(ui.processAll().then(function () {
return nav.navigate(uri, pageParameters);
}));
}
});

Приложения XAML

Для приложений XAML в стиле Metro класс Windows.UI.Xaml.Application выполняет значительную часть работы, требуемой для реализации поддержки активации в приложении. Этот класс предоставляет набор строго типизированных методов активации, которые можно переопределить для поддержки распространенных контрактов, таких как "Поиск". Для всех активаций контрактов, у которых нет строго типизированного метода, вы можете переопределить метод OnActivated и проверить тип активации, чтобы определить контракт, для которого ваше приложение активируется.

Проекты новых приложений XAML в Visual Studio предоставляются с уже созданным кодом, который использует класс Windows.UI.Xaml.Application для обеспечения возможности активации приложения посредством обычного запуска. Код для обработки этой активации находится в представлении класса для вашего приложения, указанном в файлах App.xaml.cs/cpp/vb.

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

      1. Добавьте объявление поиска в свой манифест, используя конструктор манифестов Visual Studio.
      2. Поместите в конструктор класса App для App.xaml.cs/cpp/vb любой код общей инициализации, который должен выполняться при каждом запуске приложения и независимо от причины такого запуска.
      3. Переопределите строго типизированный метод OnSearchActivated в App.xaml.cs/cpp/vb для обработки активации поиска.
      4. Загрузите свой пользовательский интерфейс поиска и отобразите результаты поиска для запроса, получаемые в SearchActivatedEventArgs.

Как и в случае с приложениями JavaScript, существует более простой способ, чем выполнение всей этой работы вручную. Так, вы можете использовать средства Visual Studio. Щелкните проект правой кнопкой мыши, выберите команды "Добавить" > "Новый элемент" и выберите элемент "Контракт "Поиск"" в диалоговом окне. Основная часть приведенного здесь кода и пользовательского интерфейса поиска, отображающего результаты в соответствии с нашими рекомендациями по поиску UX, создается автоматически.

Ниже приведены фрагменты кода C# из моего приложения "Фотографии", в которых показана поддержка активации поиска.

Мы должны переопределить метод OnSearchActivated, чтобы обеспечить поддержку активации поиска:

protected override void OnSearchActivated(SearchActivatedEventArgs args)
{
// Load Search UI
PhotoApp.SearchResultsPage.Activate(args.QueryText);
}

Метод Activate объекта SearchResultsPage настраивает пользовательский интерфейс, который отображает результаты поиска для выполненного пользователем запроса поиска:

// SearchResultsPage.xaml.cs code snippet 
public static void Activate(String queryText)
{
// If the window isn't already using Frame navigation, insert our own frame
var previousContent = Window.Current.Content;
var frame = previousContent as Frame;
if (frame == null)
{
frame = new Frame();
Window.Current.Content = frame;
}
// Use navigation to display the results, packing both the query text and the previous
// Window content into a single parameter object
frame.Navigate(typeof(SearchResultsPage1),
new Tuple<String, UIElement>(queryText, previousContent));
// The window must be activated in 15 seconds
Window.Current.Activate();
}

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

Сценарий 2. Интеграция активации средства выбора файлов в приложение

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

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

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

Средство выбора запускается и позволяет пользователю выбрать файл из приложения SkyDrive.

Поддержка средства выбора файлов в приложении SkyDrive

Давайте рассмотрим, как вы можете правильно обеспечить поддержку активации средства выбора файлов в своих приложениях JavaScript и XAML.

Приложения JavaScript

Для приложений JavaScript в стиле Metro активация встроенного представления работает аналогично активации основного представления, за исключением одной отличительной черты: активация встроенного представления всегда происходит в новом окне и в контексте скрипта. Это значит, что ваш код для обработки данной активации не может осуществить доступ к библиотекам, глобальным переменным или модели DOM основного приложения.

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

      1. Создайте новую страницу HTML, которая предназначена специально для обработки исключительно контракта "Средство выбора файлов".
      2. Добавьте объявление средства выбора файлов в конструктор манифестов Visual Studio и укажите новую страницу HTML в качестве начальной.
      3. Для повышения производительности загрузите на этой странице только те ресурсы JavaScript и другие ресурсы, которые необходимы для поддержки контракта "Средство выбора файлов".
      4. Сформируйте структуру обработчика событий активации таким образом, чтобы он обрабатывал только активацию для контракта "Средство выбора файлов". За время жизни задачи выбора файлов этот обработчик вызывается всего один раз.
      5. Используйте аргументы события активации для взаимодействия со средством выбора файлов.

Чтобы сэкономить время, для выполнения этой работы вы можете использовать средства Visual Studio. Щелкните проект правой кнопкой мыши, выберите команды "Добавить" > "Новый элемент" и выберите элемент "Контракт "Средство выбора файлов"" в диалоговом окне. Основная часть приведенного ниже кода создается в вашем проекте автоматически.

Ниже приведен фрагмент кода из файла fileOpenPicker.js для моего приложения "Фотографии", в котором показана поддержка активации средства выбора файлов:

// Register activated event handler for handling File Open Picker activation
WinJS.Application.addEventListener("activated", function (eventObject) {
if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.fileOpenPicker) {
pickerUI = eventObject.detail.fileOpenPickerUI;
pickerUI.onfileremoved = fileRemovedFromPickerUI;
...
}
});

WinJS.Application.start();

Приложения XAML

Для приложений XAML в стиле Metro вы реализуете поддержку активации встроенного представления аналогично активации основного представления. Основное различие заключается в том, что для обработки этой активации ваше приложение должно создавать новый поток и новое окно. Код из шаблона Visual Studio выполняет за вас всю работу по созданию нового потока и нового окна для активаций встроенного представления.

Для обработки активации средства выбора файлов приложение XAML должно выполнить указанные ниже действия.

      1. Добавить объявление средства выбора файлов в ваш манифест, используя конструктор манифестов Visual Studio.
      2. Переопределить метод OnFileOpenPickerActivated в App.Xaml.cs/cpp/vb и загрузить страницу, которая будет обрабатывать этот контракт.
      3. Передать FileOpenPickerActivatedEventArgs на страницу, обрабатывающую данный контракт, чтобы она могла взаимодействовать со средством выбора файлов.

Чтобы сэкономить время, для выполнения этой работы вы можете использовать средства Visual Studio. Щелкните проект правой кнопкой мыши, выберите команды "Добавить" > "Новый элемент" и выберите элемент "Контракт "Средство выбора файлов"" в диалоговом окне. Основная часть приведенного ниже кода создается в вашем проекте автоматически.

Ниже приведен фрагмент кода C# из файла fileOpenPicker.js для моего приложения "Фотографии", в котором показана поддержка активации средства выбора файлов:

// App.xaml.cs code snippet
protected override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args)
{
var fileOpenPickerPage = new PhotoApp.FileOpenPickerPage();
fileOpenPickerPage.Activate(args);
}

// FileOpenPickerPage.xaml.cs code snippet
public void Activate(FileOpenPickerActivatedEventArgs args)
{
this._fileOpenPickerUI = args.FileOpenPickerUI;
this._fileOpenPickerUI.FileRemoved += FileOpenPickerUI_FileRemoved;

// Show the user’s photos in the Picker UI
...

Window.Current.Content = this;
// The window must be activated in 15 seconds
Window.Current.Activate();
}

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

Заключение

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

Что следует запомнить:

      1. Помещайте любую общую логическую схему инициализации приложения в такое расположение, где она будет выполняться независимо от способа активации приложения.
      2. Ваши обработчики активации могут выполняться даже в том случае, когда приложение уже запущено или приостановлено. Убедитесь, что это не приводит к непредусмотренным последствиям для работы приложения.
      3. Средства Visual Studio могут выполнять за вас большой объем работы по обеспечению поддержки контракта получателя данных, контрактов "Поиск" и "Средство выбора файлов". Все что вам нужно сделать — щелкнуть проект правой кнопкой мыши и выбрать команды "Добавить" > "Новый элемент".
      4. При получении активации встроенного представления загружайте только тот код, который необходим для выполнения связанной с активацией задачи.

Для получения дополнительных сведений об активации и контрактах в Windows 8 вы можете перейти по приведенным ниже ссылкам или задать вопросы на наших форумах:

Документация

Примеры

Спасибо,

Дерек Гебхард (Derek Gebhard)
Руководитель программы, рабочая группа по взаимодействию с пользователями Windows

Соавторы: Джейк Сабульски (Jake Sabulsky), Марко Матос (Marco Matos), Дэниел Оливер (Daniel Oliver)