Программная логика приложений для Windows 8 и их взаимодействие с системой

Плитки, уведомления, экран блокировки и фоновые задачи

Разбить на страницы
Показывать лекцию целиком

Материалы к лекциям 4-6 Вы можете скачать здесь.

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

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

Это изменилось с приходом Windows 8. Как недавно выразился один журналист: "Использовать Windows 8 – это все равно, что жить в доме, сделанном из Интернета. Начальный экран – блестящая инновация, огромное улучшение по сравнению с рабочим столом, замусоренным папками на других ОС, который не выполняет ничего полезного, разве что показывает фоновую фотографию. Начальный экран делает возможным быть в курсе десятка событий", - если не больше, могу я добавить! - "За пять секунд – из любого приложения, просто нажав на клавишу Windows, вы можете проверить, есть ли у вас новое электронне письмо, предстоящее дело, ненастная погода или горячие новости. Нажмите на клавишу Windows еще раз – и вы вернетесь в приложение, из которого пришли" . Он продолжает предполагать, сколько времени это заняло бы, если бы вам нужно было заходить в отдельные приложения и проверять ту же информацию, даже с использованием высокоскоростного широкополосного соединения!

Что делает Начальный экран по-настоящему живым, так это то, что мы называем динамическими (живыми) плитками (live tiles), это ответ Microsoft на необходимость собирать вместе информацию из разных источников, в основной части среды взаимодействия пользователя и системы, среды, которая "постоянно изменяется и обновляется", как выразился тот же журналист: "так как каждая ее частица подключена к Интернету"

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

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

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

Прежде чем продолжать. Вернитесь к разделу "Включение и выключение анимации во всей системе", в Главе 5 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", и проверьте вашу Панель управления. Если "анимация, в которой нет необходимости" будет отключена, живые плитки не будут анимироваться и вы не сможете увидеть все их возможности.

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

В-третьих, многие возможности, о которых мы будем здесь говорить, недоступны в Имитаторе Windows, такие, как живые плитки, всплывающие уведомления и экран блокировки. Запуская примеры в Visual Studio, убедитесь в том, что используете возможности отладки в режиме Локальный компьютер (Local Machine) или Удаленный компьютер (Remote Machine).

И, наконец, API плиток и уведомлений можно найти в Windows.UI.Notifications, что слишком длинно, чтобы писать это каждый раз. Если не упомянуто иное, предпоагается, что API WinRT, о которых мы говорим, находятся в этом пространстве имен.

Динамичная деятельность: визуальный тур

Когда приложение только получено из Магазина Windows и установлено на устройстве, его основная плитка, как мы уже знаем, добавляется на Начальный экран. Эта плитка может быть квадратной или прямоугольной, в зависимости от того, какие графические элементы предусмотрены разработчиком. Если приложение предоставляет изображения и для квадратных, и для прямоугольных плиток, пользователь может, используя команду панели приложения, менять ее параметры (рис. 4.1).

(рис 4.1) Типичный Начальный экран с встроенными приложения и панелью приложения. Показанная команда (третья слева) позволяет сделать прямоугольную плитку меньше, превратив ее в квадратную. Та же команда, выполненная для квадратной плитки может выглядеть как Больше (Larger) (смотрите наложенное изображение), если приложение поддерживает прямоугольные плитки

Когда вы устанавливаете Windows 8 на устройство, вы можете не заметить, что на Начальном экране есть что-то статичное, плитки для нескольких встроенных приложений (наподобие Weather (Погода), News (Новости) и Bing) обновляются, но большая их часть статична. Но как только вы запутсите некоторые из этих приложений – что займет у вас пару секунд! – начальный экран начнет отображать больше изменяющейся информации, многие плитки будут меняться каждые несколько секунд, как я попытался показать на рис. 4.2. и рис. 4.3. Это происходит потому, что приложениям нужно запуститься хотя бы раз для того, чтобы установить первоначальные связи со связанными с ними веб-сервисами и активировать свои динамические плитки .

(рис 4.2) Начальный экран после запуска некоторых из встроенных приложений и выполнения некоторых настроек, наподобие подключения приложения People (Люди) к моей учетной записи в Facebook (рис 4.3) Тот же самый экран через несколько секунд после того, как некоторые приложения обновили свои плитки

Список того, что может появиться на каждой плитке, довольно обширен и разнообразен. Как вы можете видеть на предыдущих рисунках, квадратные и прямоугольные плитки могут отображать текст, изображения, название приложения или логотип (в нижнем левом углу) и другие маленькие значки (глифы), или числа, которые называются индикаторами событий (badge) в нижнем правом углу (на плитках приложения Mail (Почта) и Store (Магазин) на рис. 4.3, например).

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

(рис 4.4) Панель приложения для Начального экрана при выделении плитки. Команда Turn live tile off (Отключить динамические плитки) отключит обновление для конкретной плитки, поэтому постарайтесь не докучать пользователям излишним "шумом"!

Плитки могут принимать обновления даже тогда, когда приложение не запущено (как мы увидим в следующем разделе: "Четыре источника для обновлений и оповещений". Плитки так же могут циклически отображать до пяти обновлений. Это важная возможность, которая сокращает общее число обновлений, которое необходимо получить из Интернета (а значит, экономится энергия). То есть, циклически отображая различные свежие данные, плитка продолжает выглядеть работающей даже если получает обновления с интервалом в 5 – 15 минут, вместо 5 – 15 секунд.

Совет. Хотя динамические плитки можно обновлять часто, используя push-уведомления, будьте осторожны и не злоупотребляйте этой возможностью. Рассматривайте динамические плитки как средства просмотра содержимого приложения, а не как гаджеты: избегайте попыток реализовать в живой плитке функции приложения (вроде часов), так как вы не можете положиться на высокочастотные обновления. Более того, обновление плиток состоит лишь из XML, который задает содержимое плитки – обновления не могут вызывать выполнение какого-либо кода. В конце концов, думайте о реальном опыте взаимодействия, который вы хотите предоставить посредством динамической плитки, и используйте самый длительный период обновления, который возможно, при котором эта цель достижима.

Во Введении я упоминал, что благодаря установке большего количества приложений из Магазина Windows возможности Начального экрана стремительно растут. Но новые приложения – это не единственный способ, благодаря которому на экране может появиться больше плиток. Приложения так же могут создавать вторичные плитки, поддерживающие все возможности плиток приложения. Вторичные плитки – это обычный способ создавать закладки на страницы приложения. Вторичная плитка обычно создается с помощью команды Закрепить (Pin) на панели приложения. По запросу приложения на создание плитки, Windows автоматически запрашивает согласие пользователя, как показано для приложения Weather (Погода) на рис. 4.5, таким образом, пользователь всегда контролирует Начальный экран (таким образом, приложения не могут его замусорить!). В данном случае приложение Weather (Погода) позволяет вам закреплять дополнительные плитки для каждого расположения, параметры которого вы настроили. Дополнительная плитка всегда включает в себя специфическую информация, которая передается приложению, когда оно запускается, позволяя ему отобразить нужную страницу.

(рис 4.5) Закрепление дополнительной плитки приложения Weather (Погода) с использованием команды Закрепить на начальном экране (Pin to start), показанное здесь с автоматическим запросом на подтверждение операции

В приложении People (Люди), похожим образом, вы можете закрепить, то есть, создать дополнительную плитку, для конкретного человека. В приложении Mail (Почта) вы можете закрепить различные учетные записи и папки. В Internet Explorer можно выполнять закрепление на начальном экране любимых веб-сайтов. У вас есть идея: дополнительные плитки позволяют вам заполнять Начальный экран весьма персонализированными представлениями из разных приложений. Пользователь может так же открепить любую плитку приложения в любое время (в том числе – и основную плитку, что может произойти, когда кто-то создал несколько дополнительных плиток для получения доступа к конкретным частям программы). Приложение так же может запросить открепление плитки у Windows, в ответ система выдаст запрос на подверждения этого действия пользователем.

Совет для пользователя. Возможно, вы знаете, что вы можете перемещать плитки по Начальному экрану в различные его разделы. Но знаете ли вы, что вы так же можете создавать заголовки групп для этих разделов? Для того, чтобы это сделать, выполните операцию семантического масштабирования на Начальном экране (жест сжатия, Ctr+вращение колеса мыши, или Ctrl+клавиша со знаком "-"), выберите группу и воспользуйтесь командой Назвать группу (Name group) на панели приложения:

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

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

В качестве дополнительного материала по живым плиткам, посмотрите материал "Обновление живых иконок без разрядки аккумулятора" (http://blogs.msdn.com/b/b8_ru/archive/2011/11/09/updating-live-tiles.aspx ) в блоге разработчиков Windows 8. Это хороший материал о том, как, с точки зрения системы, эффективно управлять плитками.

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

>По этой причине – для отображения обычной срочной информации из приложений, которые не находятся в данный момент на переднем плане – Windows 8 предоставляет всплывающие уведомления. Эти сообщения выскакивают (как настоящие тосты, но без хлебных крошек) в верхнем правом углу экрана (в верхнем левом для языков, где пишут справа налево). Они появляются поверх приложения переднего плана, как показано на рис. 4.6, так же – на Начальном экране и на рабочем столе. В одно и то же время может появиться до трех всплывающих уведомлений, и каждое может сопровождаться предопределенным звуковым сигналом, если нужно.

Всплывающие уведомления, наподобие обновлений плиток, создают с использованием предопределенных шаблонов, они могут состоять из изображений, текста, логотипов. Они всегда использую цветовую схему связанного с ними приложения, как определено в его манифесте (установки Текст переднего плана (Foreground Text) и Цвет фона (Background Color) в разделе Интерфейс приложения (Application UI section).

Цель всплывающих уведомления, опять же, дать пользователю сигнал или другую срочную информацию, но по умолчанию они, прежде чем исчезнуть, появляются на короткое время. Длительность показа всплывающего уведомления по умолчанию – пять секунд, но его можно установить на длительность вплоть до пяти минут в разделе Параметры ПК > Специальные возможности (PC Settings > Ease of Access), как показано на рис. 4.7. Приложения могут создавать уведомления, которые показываются долго, до 25 секунд, или в соответствии с установками в разделе Специальные возможности (Ease of Access setting), в зависимости от того, что дольше. Более того, приложения могут создавать циклически отображаемые уведомления для событий наподобие телефонного звонка или другой ситуации, в которой другой человек может ждать на другом конце линии и есть смысл сохранять активность уведомления в течение некоторого времени.

(рис 4.6) До трех всплывающих уведомления может быть отображено поверх приложения переднего плана (в том числе – на Начальном экране и рабочем столе). Каждое уведомление, так же, может воспроизводить заданные звуковые оповещения. (рис 4.7) Настройка длительности всплывающего уведомления (выпадающий список) в разделе Параметры ПК > Специальные возможности (PC Settings > Ease of Access)

Как и в случае с обновлениями плиток, у пользователя есть возможности полного управления всплывающими уведомлениями. Для системы в целом, для экрана блокировки и для конкретного приложения. Пользователи могут выполнить эти настройки в разделе Параметры ПК > Уведомления (PC Settings > Notifications), как показано на рис. 4.8. Это, в конечном счете, означает, что вам следует сделать ваши уведомления ценными для пользователя. Если вы показываете много ненужных уведомлений, есть вероятность, что пользователь отключит их для вашего приложения или для всей системы (и оставить плохой отзыв о вашем приложении в Магазине Windows).

(рис 4.8) Пользователь может тонко настраивать уведомления в разделе Параметры ПК > Уведомления (PC Settings > Notifications)

Как и в случае с дополнительными плитками, каждое всплывающее уведомление содержит специфические данные, которые будут переданы связанному с ним приложению, когда оно будет активировано. Если приложение приостановлено, конечно, Windows переключится на это приложение и вызовет его событие activated с данными из уведомления. Если приложение не исполняется, Windows запустит его. (Кстати, сочетание клавиш Win+V, циклически переводит фокус ввода между активными уведомлениями, а нажатие на Enter позволяет активировать уведомление).

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

На самом деле, так и есть! Как мы уже видели с приложением для фонового воспроизведения музыки в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", то, что приложение, находящееся в фоновом режиме, приостановлено – это не непреложное правило . Это лишь подход Windows к экономии энергии батарей, когда она не позволяет произвольным приложениям выполняться в фоновом режиме по любым причинам. Вместо этого Windows позволяет приложениям исполнять целенаправленные фоновые задачи для конкретных целей, называемых триггерами, с учетом конкретных квот на использование ресурсов процессора и сетевого ввода-вывода. Как вы можете ожидать, приложение объявляет подобные задачи в своем манифесте.

Триггеры предоставляют сведения об изменениях условий сетевого соединения, изменении часового пояса, об обновлениях приложении, об истечении времени таймера (с интервалом в 15 минут), или о прибытии push-уведомления из онлайнового источчника (таким образом, оповещение отправляется в ответ на события, которые являются внешними по отношению к устройству). Каждый триггер так же можно настроить с использованием условий, таких, как есть ли подключение к Интернету или нет. В любом случае, общая задача фоновых задач заключается не в том, чтобы запускать приложения – на самом деле, фоновые задачи не могут отображать произвольные пользовательские интерфейсы. Скорее, фоновые задачи позволяют приложениям обновлять свои внутренние состояния, и, когда нужно, вызывать обновления плиток или всплывающие уведомления, с помощью которых пользователь может решить активировать приложение для дальнейших действий.

Еще один дополнительный аспект фоновых задач заключается в том, что Windows ограничивает общее количество приложений, которые могут обрабатывать определенные виды триггеров: таймеров, получения push-уведомлений, приема данных из сети по каналу управления, как используется приложениями для общения в реальном времени. Ограничение накладывает по той причине, что подобные приложения должны быть добавлены на экран блокировки для того, чтобы их задачи могли исполняться.

Экран блокировки, как вы, конечно, знаете, и как показано на рис. 4.9, это то, что отображается тогда, когда пользователь должен войти в систему. Устройство может быть либо заблокировано пользователем, либо может сделать это самостоятельно, через некоторое время неактивности. Исключение – для тех случаев, когда приложение отключает автоматическое блокирование посредством API Windows.System.Display.DisplayRequest, как показано в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".

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

Тем не менее, Windows не принуждает пользователя к входу в систему лишь для того, чтобы увидеть самые важные сведения из его самых важных приложений. Посредством Параметров ПК (PC Settings), как показано на рис. 4.10., пользователь может добавить до семи приложений на экран блокировки (при условии, что эти приложения запросили доступ, что является предметом решения пользователя). Эти приложения должны зарегистрировать для работы на экране блокировки соответствующие фоновые задачи, с помощью которых они осуществляют обновление индикаторов событий на экране блокировки. Именно их вы видите вдоль нижней части экрана на рис. 13.9, где каждый глиф индикатора (число) так же соответствует монохромному изображению, которое называется Индикатор событий (Badge Logo) в манифесте приложения. Эти изображения должны иметь размеры 24x24 для 100%, 33x33 для 140%, и 43x43 длы 180%, и они должны содержать только белые или прозрачные пиксели.

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

(рис 4.10) Настройка экрана блокировки и приложений экрана блокировки в разделе Параметры ПК (PC Settings)

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

Четыре источника для обновлений и уведомлений

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

(рис 4.11) Локальные обновления от исполняющегося приложения (running app) вступают в силу немедленно

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

(рис 4.12) Назначенными уведомлениями управляет система. Они появляются в запрошенное время, независимо от состояния исходного приложения

Третий способ отправки обновлений, которым может пользоваться приложение, на этот раз – только для плиток и индикаторов событий – это периодические обновления. Как показано на рис. 4.13, исполняющееся приложение, если в этом есть необходимость, может настроить системные средства обновления плиток и индикаторов уведомлений для запроса обновления с заданного URI веб-сервиса в определенные интервалы с невысокой частотой (минимум – 30 минут), начиная с заданного времени. Веб-сервис отвечает на данный HTTP-запрос в формате XML, что аналогично тому, что исполняющееся приложение предоставляет при локальном обновлении, и обновления могут быть установлены с указанием даты и времени истечения, в итоге они автоматически удаляются из цикла обновлений, когда это нужно. Среди всех этих возможностей, периодические обновления полностью подходят многим приложениям для создания очень динамичных живых плиток со сравнительно небольшими усилиями.

(рис 4.13) Периодические обновления для плиток и индикаторов событий регистрируются в системном средстве обновления плиток, которое запрашивает обновления с веб-сервиса с постоянной периодичностью

Конечно, минимальный интервал в 30 минут может быть недостаточно быстрым, если приложение хочет оповестить о чем-либо пользователя так быстро, как это возможно. Поэтому у нас есть четвертое средство для обновлений – push-уведомления – и этот метод подходит как для плиток и всплывающих уведомлений, так и для уведомлений, не имеющих отношения к пользовательскому интерфейсу (необработанные уведомления, raw notifications).

Push-уведомления, это уведомления, которые отправляются напрямую на устройство, не по запросу приложения, а по запросу некоторого веб-сервиса, который обычно круглосуточно осуществляет мониторинг информации или каких-то особых условий. Как показано на рис. 4.14, этот веб-сервис задействует бесплатный Windows Push Notification Service (WNS для краткости) для отправки уведомлениям, которые создали канал для этой цели. Каждый канал предназначен для индивидуального пользователя и устройства. Как и в случае с другими обновлениями, эти требуют хотя бы одного запуска приложения, так как в течение этого запуска приложение настраивает WNS-канал для данного устройства.

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

(рис 4.14) Push-уведомления исходят из веб-сервисов, которые работают всегда и затем направляются службе WNS для доставки конкретным клиентам (конкретному приложению на конкретном пользовательском устройстве) посредством зарегистрированных приложениями WNS-каналов

Полезную сводку по всем этим механизмам обновления можно найти в материале "Выбор способа доставки уведомлений" (http://msdn.microsoft.com/library/windows/apps/Hh779721.aspx ). Сюда вклюыены примеры использования каждого метода. В любом случае, сейчас мы готовы к тому, чтобы узнать подробности о том, как применять каждый из этих методов для того, чтобы поддерживать систему в динамичном состоянии активного диалога с пользователем.

Плитки, дополнительные плитки и индикаторы событий

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

Сейчас я предлагаю вам обратиться к Главе 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript" и просмотреть раздел "Основы брендинга приложений: экран-заставка и другие визуальные элементы", где говорится о том, как различные данные манифеста влияют на плитки, например, параметры Краткое имя (Short Name) и Показывать имя (Show Name). В данном разделе так же говорится о том, что нужно помнить о необходимости предоставления значков, рассчитанных на различное масштабирование разрешения.. Даже если вы запустите обновление плиток как только будет открыто ваше приложение, статические плитки будут важны для оказания первого впечатления на пользователя, сразу после того, как приложение будет установлено из Магазина Windows. Статические плитки так же нужны, так как именно их будет видеть пользователь, если отключит обновление вашей динамической плитки или у всех обновлений на вашей плитке истечет срок актуальности. Таким образом, даже если вы планируете использовать динамические плитки, не забудьте позаботиться о качественном дизайне статических плиток.

Использование квадратных и прямоугольных статических плиток позволяет вам отправлять обновления динамических плиток и на те и на другие, в том числе – на квадратные и прямоугольные дополнительные плитки. В обоих случаях, постарайтесь подумать о том, что пользователю особенно хотелось бы видеть на плитках. Когда пользователи выбирают прямоугольную широкую плитку, они хотят, чтобы ваша плитка занимала больше места на Начальном экране, очевидно, что они желают видеть некоторые подробности, которые добавляют ценности данным на Начальном экране. Если пользователи выбирают, с другой стороны, квадратную плитку, они, возможно, больше заинтересованы лишь в самых необходимых сведениях: в сведениях о количестве новых сообщений электронной почты (что выводится с помощью индикатора событий), например, вместо первых строк из этих сообщений, или о текущей температуре в выбранном месте вместо расширенного прогноза погоды

"Руководство и контрольный список для плиток и индикаторов событий" (http://msdn.microsoft.com/library/windows/apps/hh465403.aspx ) содержит довольно обширное руководство по этим темам вместе с рекомендациями по использованию зрачков, названий, индикаторов событий и обновлений. Вот полезный материал в блоге разработчиков Windows: "Эффективное использование плиток" (http://blogs.msdn.com/b/windowsappdev_ru/archive/2012/04/20/10296004.aspx ). Здесь можно узнать о том, как обновления и индикаторы событий отправляются на плитку, в этот процесс включено то, что называется XML-шаблоном плитки, предопределенная XML-конфигурация, которую вы заполняете текстом, изображениями, задаете другие свойства. Эти шаблоны применимы ко всем формам плиток и методам обновления, которые мы скоро рассмотрим. Для начала, однако, посмотрим, как управлять дополнительными плитками, так как все, о чем мы будем говорить после этого, в равной степени применимо ко всем плиткам приложения.

Примечание API для работы с плитками и уведомления обычно распложены в Windows.UI.Notifications, за исключением тех из них, которые используются для создания вторичных плиток и находятся в Windows.UI.StartScreen. Если не указано иное, предполагается, что API, о которых мы говорим, находятся именно в пространстве имен Windows.UI.Notifications. Таким образом, мы не будем всякий раз указывать его.

Дополнительные плитки

Дополнительные (вспомогательные) плитки напоминают закладки для приложения, для достижения того, что еще называется глубоким связыванием (deep linking): способом запуска приложения в определенном состоянии или с открытием конкретной страницы. Дополнительные плитки позволяют пользователю персонализировать свой Начальный экран с помощью конкретных представлений приложения. Как отмечено в материале "Руководство и контрольный список для вспомогательных плиток" (http://msdn.microsoft.com/library/windows/apps/hh465398.aspx ) (я настоятельно рекомендую почитать этот материал), предоставление возможности создания дополнительных плиток – это хорошая идея, когда у вас есть состояния приложения, которые могут быть полезной целью или пунктом назначения при его запуске. Не создавайте, однако, дополнительные плитки, для статического содержимого или для использования их как виртуальных командных кнопок – это лишь научит ваших пользователей тому, что им не следует беспокоиться о том, чтобы закреплять на Начальном экране плитки из вашего приложения.

Приложение создает дополнительную плитку в ответ на команду Закрепить (Pin), которая обычно включается в его панель приложения (с использованием значка WinJS.UI.AppBarIcon.pin). Предложите эту команду, когда приложение отображает содержимое, которое имеет смысл закрепить на Начальном экране, или если пользователь сделал соответствующее выделение. Скрывайте или отключайте команду, если содержимое или выделения не подходят для закрепления. Вдобавок, меняйте ее на команду Открепить (Unpin), если содержимое уже закреплено. Для того, чтобы узнать подробности об управлении командами панели приложения, обратитесь к Главе 1 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".

Когда активирована команда Закрепить (Pin), приложение делает запрос на создание плитки. Затем Windows запрашивает согласие пользователя, как показано ранее на рис. 4.5.

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

Создание дополнительных плиток

Процесс создания дополнительной плитки в ответ на команду закрепления довольно прост: сначала создается экземпляр объекта Windows.UI.StartScreen.SecondaryTile ( http://msdn.microsoft.com/library/windows/apps/windows.ui.startscreen.secondarytile.aspx) с необходимыми свойствами, затем вызывается либо его метод requestCreateAsync , либо метод requestCreateForSelectionAsync. Если пользователь подтвердил создание плитки, она будет добавлена на Начальный экран и обработчик завершения получит аргумент с результатом операции true. Если пользователь закрыл всплывающее окно (прикоснувшись к экрану за его пределами), обработчик завершения будет вызван с результатом false. Обработчик ошибки для этих методов будет вызван, если возникнет исключение, например, если вы не предоставите необходимые свойства для SecondaryTile.

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

  • SecondaryTile() Создает SecondaryTile со свойствами по умолчанию.
  • SecondaryTile(tileId) Инициализирует SecondaryTile заданным ID, что обычно используется когда объект создается перед обновлением или при откреплении плитки.
  • SecondaryTile(tileId, shortName, displayName, arguments, tileOptions, logo) Создает SecondaryTile со всеми свойствами, необходимыми для квадратной плитки.
  • SecondaryTile(tileId, shortName, displayName, arguments, tileOptions, logo, wideLogo) Создает SecondaryTile со всеми необходимыми свойствами для широкой прямоугольной плитки.
  • Эти опции очевидным образом соотносятся со следующими свойствами объекта SecondaryTile, каждое из которых необходимо, когда вы вызываете метод requestCreate*, (за исключением опции wideLogo, которая нужна только при создании прямоугольной плитки):

  • tileId Уникальная строка (максимум 64 алфавитно-цифровых знаков, включая "." и "_"), которая идентифицирует плитку в пакете приложения. Вам это понадобится, когда вы захотите обновить или удалить плитку, и это свойство всегда должно быть установлено. Это значение обычно из содержимого, связанного с плиткой. Если вы создаете дополнительные плитки с tileId, которое уже существует, новая плитка займет место старой.
  • shortName Текстовая строка (максимум – 40 символов), которая инициализирует содержимое имени плитки, как показано на рис. 4.5. Оно отображается непосредственно на плитке, но может быть изменено пользователем до создания плитки. Когда плитка создана, это значение содержит строку, которая на ней отображается.
  • displayName Отображаемое имя плитки, которое будет показано в всплывающей подсказке к плитке, напротив приложения в списке Начального экрана Все плитки (All Tiles) и в некоторых других местах в Windows. Оно может быть любой необходимой длины и может содержать любые символы.
  • arguments Строка, которая передается обработчику активации приложения при активации дополнительной плитки.
  • ), которые могут быть скомбинированы с помощью оператора | (побитовое OR). Опции включают в себя следующие значения: none (по умолчанию), showNameOnLogo (отображать shortName на квадратной плитке), showNameOnWideLogo (отображать shortName на прямоугольной плитке), и copyOnDeployment (показывает, что дополнительная плитка должна перемещаться в облако и копироваться на другие устройства, когда текущий пользователь устанавливает приложение, которому принадлежит плитка).
  • logo URI для изображения квадратной плитки. Здесь можно использовать локальную схему ms-appx:/// или ms-appdata:///. Помните о том, что не следует хранить динамически создаваемое изображение во временном хранилище и постарайтесь не удалить его до тех пор, пока существует плитка, ссылающаяся на это изображение.
  • wideLogo URI для изображения прямоугольной плитки, опять же, здесь можно использовать локальные схемы ms-appx:/// и ms-appdata:///.
  • Вы можете, конечно, модифицировать любое из этих свойств после создания объекта )), ), либо dark, либо light), и smallLogo (снова, URI с локальной схемой ms-appx:/// или ms-appdata:///). Два других свойства, lockScreenBadgeLogo и lockScreenDisplayBadgeAndTileText, связаны с дополнительной плиткой на экране блокировки. Мы вернемся к этому позже в разделе "Фоновые задачи и приложения экрана блокировки", в частности, в подразделе "Задачи, зависимые от экрана блокировки и триггеры"

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

    Методы requestCreate* так же имеют пару вариантов, которые позволяют вам управлять расположением всплывающего окна для получения подтверждения пользователя (рис. 4.5). Сам по себе вызов requestCreateAsync приводит к размещению по умолчанию, в нижнем углу экрана. Однако, обычно лучше, чтобы это всплывающее окно появилось поближе к элементу управления команды, которая вызвала его. Для этой цели requestCreateAsync принимает необязательный параметр Windows.Foundation.Point, задающий место расположения нижнего правого угла всплывающего элемента.

    У ), которое показывает, где, по отношению к этому прямоугольнику, должен появиться всплывающий элемент: выше (above), ниже (below), слева (left), и справа (right).

    Вы можете поэкспериментировать со всеми этими опциями в примере "Дополнительные плитки" (http://code.msdn.microsoft.com/windowsapps/Secondary-Tiles-Sample-edf2a178 ). Сценарии 1 и 2 демонстрируют закрепление и открепление плитки с использование кнопок, расположенных на полотне приложения, соответственно. Сценарий 7 делает то же самое с помощью кнопок на панели приложения. Мы увидим некоторые другие сценарии в следующих разделов. В данный момент функция закрепления в Сценарии 1 (js/pintile.js) демонстрирует процесс создания плитки с использованием requestCreateForSelectionAsync:

    function pinSecondaryTile() {
    var Scenario1TileId = "SecondaryTile.Logo";
    var uriLogo = new Windows.Foundation.Uri(
    "ms-appx:///images/SecondaryTileDefault-sdk.png");
    var uriSmallLogo = new Windows.Foundation.Uri(
    "ms-appx:///images/smallLogoSecondaryTile-sdk.png");
    
    // Создание аргументов активации...
    var currentTime = new Date();
    var newTileActivationArguments = Scenario1TileId + " WasPinnedAt=" + currentTime;
    
    var tile = new Windows.UI.StartScreen.SecondaryTile(Scenario1TileId,
    "Title text shown on the tile",
    "Name of the tile the user sees when searching for the tile",
    newTileActivationArguments,
    Windows.UI.StartScreen.TileOptions.showNameOnLogo, uriLogo);
    
    // Установка других параметров
    tile.foregroundText = Windows.UI.StartScreen.ForegroundText.dark;
    tile.smallLogo = uriSmallLogo;
    
    var selectionRect = document.getElementById("pinButton").getBoundingClientRect();
    
    tile.requestCreateForSelectionAsync(
    { x: selectionRect.left, y: selectionRect.top, width: selectionRect.width,
    height: selectionRect.height },
    Windows.UI.Popups.Placement.below)
    .done(function (isCreated) {
    if (isCreated) {
    // Плитка была успешно создана
    } else {
    // Плитка не была создана
    }
    });
    }
        

    Примечание. Как упомянуто в Главе 1 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", показ системного всплывающего элемента при создании дополнительной плитки (и при удалении, смотрите "Управление дополнительными плитками" ниже), приводит к потере фокуса приложением и к автоматическому закрытию панели приложения, не находящейся в режиме залипания. По этой причине Сценарий 7 примера о дополнительных плитках поддерживает панель приложения видимой, устанавливая ее свойство sticky в значение true перед вызовом API для работы с дополнительными плитками.

    Активация приложения с помощью дополнительной плитки

    Дополнительные плитки предоставляют способ активации приложения с переводом в состояние, которое отличается от состояния по умолчанию. Это похоже на то, как аргументы командной строки работают с классическими приложениями рабочего стола или с консольными программами. Этот процесс полностью зависит от содержимого свойства arguments дополнительной плитки. Когда пользователь касается дополнительной плитки или щелкает по ней мышью, вызывается событие приложения activated с видом активации launch и со значением свойства дополнительной плитки arguments в eventArgs.detail.arguments. Затем приложение предпринимает действия, предписываемые этими данными, такие, как перемещение на конкретную страницу содержимого, получение фрагмента содержимого из онлайнового источника и так далее. В примере о дополнительных плитках, код активации в файле js/default.js перемещается к странице Сценария 5, мы передаем arguments как параметр для WinJS.Navigation.navigate:

    function activated(eventObject) {
    if (eventObject.detail.kind ===
    Windows.ApplicationModel.Activation.ActivationKind.launch) {
    if (eventObject.detail.arguments !== "") {
    // Аргументы активации присутствуют (они заданы, когда
    // дополнительная плитка была закреплена)
    eventObject.setPromise(WinJS.UI.processAll().done(function () {
    // Перемещение к странице Scenario 5, где пользователю будут показаны
    // аргументы активации
    return WinJS.Navigation.navigate(scenarios[4].url, eventObject.detail.arguments);
    }));
    } else {
    // Активация по умолчанию
    }
    }
    }
        

    Элемент управления страницы (js/LaunchedFromSecondaryTile.js) принимает строку аргументов в параметре options и для метода processed и для метода ready. В примере эта строка просто выводится на экран:

    var page = WinJS.UI.Pages.define("/html/LaunchedFromSecondaryTile.html", {
    processed: function (element, options) {
    if (options) {
    document.getElementById("launchedFromSecondaryTileOutput").innerHTML += "
      " + "App was activated from a secondary tile with the following activation" +
      "arguments : " + options + "
         ";
    }
    },
    ready: function (element, options) {
    });
        

    Ваше собственно приложение, конечно, будет делать с arguments что-нибудь гораздо более интересное!

    Управление дополнительными плитками

    В дополнение к методам и свойствам для создания дополнительных плиток, класс SecondaryTile имеет два статических метода для управления дополнительными плитками приложения:

    exists ( http://msdn.microsoft.com/library/windows/apps/windows.ui.startscreen.secondarytile.exists.aspx) Возвращает логическое значение, показывающее существует ли на Начальном экране дополнительная плитка, идентифицируемая ее свойством tileId. Это сообщает вам о том, заменит ли метод requestCreate*, вызванный с тем же самы tileId существующую плитку другой. Это показано в Сценарии 4 примера о дополнительных плитках.

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

    В дополнение, есть и несколько методов для работы с конкретным экземпляром SecondaryTile:

  • requestDeleteAsync и requestDeleteForSelectionAsync Непосредственные аналоги, с теми же вариантами размещения, что и в методах requestCreate*, удаление дополнительной плитки (открепление) так же требует согласия пользователя. Это показано в Сценариях 2 и 7 примера.
  • updateAsync Применяет к объекту SecondaryTile изменения свойств после того, как плитка была закреплена на Начальном экране. Это можно видеть в Сценарии 8 примера.
  • Если вы внимательно читали этот раздел, вы могли заметить, что я еще не упоминал Сценарий 6 примера. Это потому, что он показывает, как сделать дополнительную плитку динамической плиткой с возможностью обновления. Для того, чтобы это понять, нам нужно разобраться с обновлениями, так как используемый механизм обновлений сходен для всех плиток. Это будет следующей нашей темой. – я так и планировал!

    Основы обновлений плиток

    Локальное обновление для плитки, как было описано выше в этой лекции, это обновление, которое приложение выполняет, когда оно исполняется. На самом деле, это один из лучших моментов для отправки обновлений, так как весьма вероятно, что у приложения уже есть информация для обновления любых своих плиток. Во множестве случаев, особенно, когда приложение не связано с веб-сервисом, информация, нужная для динамических плиток приложения доступна лишь во время исполнения программы. Игра, например, может отправить обновления, показывающие лучшие результаты, новые соревнования, сведения о прохождении игры и другие виды интригующих приглашений, побуждающих пользователя снова запустить приложение. (Должен отметить, что лично для меня это отлично работает с игрой Fruit Ninja.)

    Процесс отправки локального обновления плитки довольно прост, он использует API в пространстве имен Windows.UI.Notifications:

  • Создать полезные данные XML (XML Payload), как это называют, которые описывают обновление в объекте ). XML должен всегда соответствовать одному из предопределенных шаблонов плитки. Вы можете начать с XmlDocument, предоставленного системой, создать его с нуля, или использовать Notifications Extensions Library (Библиотеку расширений уведомлений), которая предоставляет объектную модель и подсказки IntelliSense для нее.
  • Создать объект ) с этим XML. XML становится свойством content объекта TileNotification и может быть установлен отдельно.
  • При необходимости, установить свойства expirationTime и tag объекта TileNotification. По умолчанию, локальные обновления не имеют срока давности и удаляются лишь при поступлении более свежих обновлений или тогда, когда применяется операция очистки. Установка expirationDate приведет к их удалению в заданное время. (Срок уведомлений, поступивших из облака, автоматически истекает через три дня). Свойство tag – это строка из 16 или меньшего количества символов, которая используется для управления стеком обновлений, которые циклически отображаются на плитке. Подробнее об этом – немного позже.
  • Вызвать ) для получения объекта ), который связан с плиткой вашего приложения. Вызвать ) (задумайтесь над этим именем!) для получения объекта TileUpdater для дополнительной плитки с заданным tileId.
  • Вызвать TileUpdater.update с вашим объектом TileNotification. (Анимация, которая используется при отображении поступившего обновления похожа на WinJS.UI.Animation.createPeekAnimation, которая описана в Главе 5 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript").
  • Совет. Если вы отправляете обновления или другие уведомления, когда ваше приложение исполняется, подумайте о том, чтобы отправлять обновления и в обработчике события resuming, если вы не собираетесь использовать другие средства, наподобие периодических обновлений или push-уведомлений для обновления плитки. С тех пор, когда приложение было приостановлено, может пройти немало времени, поэтому возобновление работы приложения – это хорошая возможность для отправки обновлений.

    Обратимся теперь к примеру "Плитки и индикаторы событий приложения" ( http://code.msdn.microsoft.com/windowsapps/App-tiles-and-badges-sample-5fc49148) для того, чтобы увидеть, как обновления выглядят в коде. Так как имитатор Visual Studio не поддерживает динамические плитки и всплывающие уведомления, не забудьте запустить пример с опциями Локальный компьютер (Local Machine) или Удаленный компьютер (Remote Machine).

    Предполагая, что у нас есть XMLDocument с обновлением в переменной tileXml, отправка обновления занимает лишь две строчки кода (смотрите js/sendTextTile.js):

    var tileNotification = new Windows.UI.Notifications.TileNotification(tileXml);
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication()
    .update(tileNotification);
        

    Похожим образом выглядит обновление дополнительных плиток в Сценарии 6 примера "Дополнительные плитки" (js/SecondaryTileNotification.js):

    var tileNotification = new Windows.UI.Notifications.TileNotification(tileXml);
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForSecondaryTile(
    "SecondaryTile.LiveTile").update(tileNotification);
        

    Гораздо более интересный вопрос заключается в том, как мы создаем переменную tileXml, содержащую полезные данные, в первом случае. Этот процесс включает в себя использование одного из предопределенных визуальных шаблонов плитки, и затем выбор метода для создания XMLDocument. Тогда мы увидим, как использовать изображения при обновлениях, а так же, как применять рекомендацию по брендированию. Локализация и обеспечение доступности – это дополнительные соображения, касающиеся обновления плиток, но мы вернемся к этим темам в Главе 6.

    Выбор шаблона плитки

    Первый шаг в создании обновления плитки заключается в выборе подходящего шаблона из "Каталога шаблонов плиток" ( http://msdn.microsoft.com/library/windows/apps/hh761491.aspx). Здесь вы найдете описания, изображения и XML для 10 доступных квадратных шаблонов и 36 прямоугольных шаблонов. Да, всего 46 разных шаблонов (надеюсь, вы понимаете, почему я не показываю здесь их все!). Некоторые – только текстовые, некоторые – графические, некоторые и с текстом и с изображением (только для прямоугольных плиток), и здесь представлено множество шаблонов, называемых обзорными (peek) шаблонами. Эти шаблоны, если вы на них взглянете на вышеупомянутой странице , составлены из двух частей, каждая из которых имеет размер всей плитки, как показано ниже для квадратной плитки (слева) и прямоугольной (справа):

    С помощью обзорных шаблонов вы можете показать вдвое больше содержимого, чем с помощью ругих. Когда обзорное обновление отображается на динамической плитке, верхняя часть появляется сразу, и затем плитка переворачивается, или дает вам возможность "взглянуть" на нижнюю часть, и затем снова переключается на верхнюю часть, после чего динамическая плитка переключается к следующему обновлению в цикле, если оно есть (Приложение Travel (Путешествия) использует обзорные шаблоны, если вам нужен пример. Анимация, которая здесь применяется, похожа на WinJS.UI.Animation.createPeekAnimation.). Конечно, обе части должны содержать связанные данные, так как они являются частями единичного обновления.

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

    Во-вторых, изображения ограничены размером в 1024x1024 и максимальным размером в 200 Кб. Если любое изображение превышает данные лимиты, все обновление не будет отображено. Очевидно, лучше стараться не использовать большие изображения, если это возможно, так как подобные изображения лишь повышают уровень потребления памяти и возможную нагрузку на сеть (если выполняется загрузка изображения). Так же, для изображений на плитках, полезно принимать во внимание коэффициенты масштабирования 80%, 100%, 140%, и 180%. Однако, если вы не хотите работать с отдельными коэффициентами масштабирования, создайте изображение для плитки для масштаба в 180% и позвольте системе уменьшить его (здесь используется высококачественный алгоритм, поэтому изображение будет выглядеть так же хорошо, как если бы вы уменьшили его с помощью ПО для редактирования фотографий). Кроме того, для фотографий, рассмотрите использование JPEG вместо PNG, так как первый обладает лучшими возможностями по сжатию подобных изображений.

    В-третьих, если вы работаете с изображениями, которые не соответствуют итоговому соотношению сторон, изображения будут масштабированы по ширине и обрезаны сверху и снизу. Отметим так же, что соотношение сторон прямоугольной плитки, не в точности 2:1. При 100% прямоугольная плитка имеет размеры 310x150 пикселей, что означает, что изображение, занимающее ее половину, будет иметь размеры в 155x150 пикселей (не вполне квадратное) и изображение в режиме просмотра коллекций (верхний правый угол правого изображения выше) будет 77.5x75.

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

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

    Сценарий 5 примера "Плитки и индикаторы событий приложения" показывает пример очень полезного дизайна и инструмента для экспериментирования с плитками, как показано на рис. 4.15. Эта часть примера скорее представляет собой инструмент, нежели код, который можно использовать в своем приложении. Его средства позволяют вам просто экспериментировать со всеми шаблонами и их содержимым, включая изображения, получаемые из локальных и удаленных источников, без необходимости каждый раз писать для этого код. Он так же позволяет вам испытать различные возможности брендинга приложений и отправки результата в качестве обновления на плитку примера на Начальном экране.

    (рис 4.15) Сценарий 5 примера "Плитки и индикаторы событий приложения" представляет собой инструмент для испытаний различных шаблонов плиток

    Создание полезных данных, Метод 1: заполнение содержимого шаблона

    Первый способ создания полезных данных XML для заданного шаблона заключается в использовании метода ), которому вы передаете имя шаблона (значение из TileTemplateType (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.tiletemplatetype.aspx )). Это показано в Сценарии 1 примера (js/sendTextTile.js):

    function sendTileTextNotificationWithXmlManipulation() {
    var tileXml = Windows.UI.Notifications.TileUpdateManager.getTemplateContent(
    Windows.UI.Notifications.TileTemplateType.tileWideText03);

    Этот метод возвращает объект XmlDocument, который содержит структуру XML для шаблона, но никакого содержимого. Если вы запустите пример и просмотрите tileXml сразу после вышеприведенного вызова, он будет содержать лишь следующее – элементы, но не данные:

    <tile>
       <visual>
         <binding template="TileWideText03">
           <text id="1"></text>
         </binding>
       </visual>
     </tile>

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

    var tileAttributes = tileXml.getElementsByTagName("text");
    tileAttributes[0].appendChild(tileXml.createTextNode(
    "Hello World! My very own tile notification"));

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

    var squareTileXml = Windows.UI.Notifications.TileUpdateManager.getTemplateContent(
    Windows.UI.Notifications.TileTemplateType.tileSquareText04);
    var squareTileTextAttributes = squareTileXml.getElementsByTagName("text");
    squareTileTextAttributes[0].appendChild(squareTileXml.createTextNode(
    "Hello World! My very own tile notification"));
    
    var node = tileXml.importNode(squareTileXml.getElementsByTagName("binding").item(0), true);
    tileXml.getElementsByTagName("visual").item(0).appendChild(node);
    Теперь все готово для того, чтобы отправить обновление плитке:
    // отправка уведомления плитке приложения
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication()
    .update(tileNotification);
    }

    Отметим, что элементы visual в XML поддерживают version (версии) атрибутов, значение по умолчанию которых равняется 1. Это поможет поддерживать будущие изменения, где добавленные элементы с более новыми версиями XML, чем та, что сейчас поставляется в Windows 8, просто будут игнорироваться. Схему, которая применяется в плитках, если вам интересно, можно найти на странице "Схема плитки" ( http://msdn.microsoft.com/library/windows/apps/br212859.aspx).

    Создание полезных данных, Метод 2: XML-строки

    Вместо того, чтобы вызывать TileUpdateManager.getTemplateContent для получения XmlDocument с содержимым шаблона, вы просто можете создать нужный XmlDocument напрямую, из строки. Это очень похоже на создание элементов в DOM с помощью использования innerHTML вместо использования DOM API. Это предусматривает уменьшение общего количества вызываемых функций для создания необходимых полезных данных и хорошо подходит для предварительного задания большого количества почти полностью заполненых вариантов обновлений

    Этот метод прост. Задайте XML-строку с содержимым для обновления, создайте новый XmlDocument, и воспользуйтесь его методом loadXml для превращения строки в полезные данные. В Сценарии 1 мы видим, как это реализуется для создания тех же полезных данных, что и в предыдущем разделе:

    function sendTileTextNotificationWithStringManipulation() {
    // создадим строку с XML-шаблоном плитки
    var tileXmlString = "<tile>
      "
      + "<visual>
        "
        + "<binding template='TileWideText03'>
          "
          + "<text id='1'>Hello World! My very own tile notification</text>"
          + "
        </binding>"
        + "<binding template='TileSquareText04'>
          "
          + "<text id='1'>Hello World! My very own tile notification</text>"
          + "
        </binding>"
        + "
      </visual>"
      + "
    </tile>";
    
    var tileDOM = new Windows.Data.Xml.Dom.XmlDocument();
    tileDOM.loadXml(tileXmlString); // Хорошая мысль – поместить это в блок try/catch
    
    var tile = new Windows.UI.Notifications.TileNotification(tileDOM);
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication()
    .update(tile);
    }

    Очевидно, этот метод очень просто, но имеет недостаток, требуя ручной обработки. Кроме того, его сложнее отлаживать. (Поиск мелких ошибок в строках не относится к моему любимому времяпрепровождению!). К счастью, есть и еще один метод: Notifications Extensions Library, который предоставляет простоту использования строк с высоким уровнем надежности.

    Создание полезных данных, Метод 3: Notifications Extensions Library

    Третье средство создания необходимого XmlDocument для обновления плитки заключается в использовании того, что называется Notifications Extensions Library(Библиотека расширений уведомлений). Это WinRT-компонент, написанный на C#, который включен во многие примеры SDK, в том числе и в пример "Плитки и индикаторы событий приложения", который мы здесь рассматриваем. (Отметим, он включен в Ссылки (References) проекта.). Мы посмотрим на структуру подобных компонентов в Главе 5. Вероятнее всего эта библиотека в будущем войдет в состав Windows API, поэтому мы рекомендуем разработчикам использовать ее.

    Библиотека упрощает заполнение шаблонов посредством свойств объекта, а не методов XmlDocument, и, так как она отлично протестирована в Microsoft, она гораздо более надежна, чем создание XmlDocument с использованием строк. Вот, как она используется в Сценарии 1 для создания, еще раз, тех же самых полезных данных, которые мы уже видели:

    function sendTileTextNotification() {
     var tileContent =
     NotificationsExtensions.TileContent.TileContentFactory.createTileWideText03();
     tileContent.textHeadingWrap.text = "Hello World! My very own tile notification";
    
     var squareTileContent = NotificationsExtensions.TileContent.TileContentFactory
     .createTileSquareText04();
     squareTileContent.textBodyWrap.text = "Hello World! My very own tile notification";
     tileContent.squareContent = squareTileContent;
    
     Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication()
     .update(tileContent.createNotification());
     }

    Проще говоря, объект библиотеки TileContentFactory предоставляет методы для создания объектов, эквивалентных XML-документам, предоставлеяемых TileUpdateManager.getTemplateContent. Как показано в вышеприведенном коде, эти объекты имеют свойства, эквивалентные каждому из полей шаблона и когда вы готовы передать данные в TileUpdater.update, вы просто вызываете метод createNotification.

    Другая причина, по которой существует эта библиотека – это упрощение процесса создания ASP.NET веб-сервисов для периодических обновлений и push-уведомлений (где в уведомлении можно отправить обновление для плитки, обновления индикатора событий и всплывающие уведомления). Вместо создания полезных данных XML вручную – ненадежный и подверженный ошибкам подход – сервис может использовать Notifications Extensions Library для простого и последовательного создания XML для всех этих уведомлений.

    Так как объектная модель библиотеки четко описывает XML, ей очень просто пользоваться. Вот еще один материал в документации на эту тему: "Краткое руководство: использование библиотеки ). И примеры, которые мы рассматриваем в этой лекции, показывают большинство вариантов ее использования.

    Использование локальных изображений и изображений, полученных из веб

    Сценарий 1 примера, как мы уже видели, показывает обновление плиток с использованием текста, но гораздо интереснее, когда в обновления входят и изображения. Они могут поступать либо из пакета приложения, локальных данных приложений, или из веб, с использованием, соответственно, таких URI, как ms-appx:///, ms-appdata:///local, и http://. Эти URI просто назначены атрибутам src элементов image в шаблонах плиток. (Это именно image, а не img, как в HTML). Снова отметим, что первые два URI обычно имеют три слэша в начале для указания на "текущее приложение". Для URI http:// требуется объявления в манифесте приложения возможности Интернет (Клиент) (Internet (Client)).

    Сценарий 2 примера (js/sendLocalImage.js) показывает использование ms-appx:/// для изображения внутри пакета приложения, с вариантами для всех трех методов создания полезных данных, которые мы уже видели. При использовании методов XmlDocument, настройка источника изображения выглядит так:

      var tileImageAttributes = tileXml.getElementsByTagName("image");
        tileImageAttributes[0].setAttribute("src", "ms-appx:///images/redWide.png");
        Notifications Extensions Library дает нам свойства, которым мы можем присваивать URI:
        var tileContent = NotificationsExtensions.TileContent.TileContentFactory
        .createTileWideImageAndText01();
        tileContent.textCaptionWrap.text = "This tile notification uses ms-appx images";
        tileContent.image.src = "ms-appx:///images/redWide.png";

    А при использовании XML-строк, вы можете включить URI напрямую в элемент image.

    Сценарий 3 (js/sendWebImage.js) показывает то же самое, за исключением того, что вы можете использовать URI http://. Это хороший способ увидеть воздействие указания изображений, которые имеют различные соотношения сторон, как и тех, которые превышают разрешенные размеры в 1024 пикселя и размер файла в 200 Кб. Как вы можете увидеть, в подобных случаях обновления просто не отображаются.

    Что касается URI ms-appdata:///local (перемещаемые и временные расположения не разрешены), его использование показано в Сценарии 8, где вы можете выбрать изображение с помощью средства выбора файлов и пример копирует его в папку локальных данных приложения. Затем на него, в составе полезных данных обновления, ссылаются как на файл, по URI ms-appdata:///local (js/imageprotocols.js):

        tileContent = NotificationsExtensions.TileContent.TileContentFactory.createTileWideImage();
        tileContent.image.src = "ms-appdata:///local/" + imageRelativePath;

    Тот же сценарий позволяет вам экспериментировать с URI, указывающими на изображения в пакете и удаленные изображений, что позволяет реализовать инструментарий, представленный в Сценарии 5. Я так же обновил мое приложение "Here My Am!" для этой лекции (в материалах к лекции), добавил обзорный шаблон плитки с обновлением, которое содержит свежие изображения и расположения. Смотрите врезку "PNG против JPG" ниже.

    Если говорить об инструментах и изображениях, посмотрите так же Сценарий 10 в SDK-примере. Он даст вам еще один полезный инструмент для обновления файлов, где вы можете обрезать и настроить изображения в соответствии с различнй плотностью пикселей так, чтобы эти изображения хорошо подходили к выбранному шаблону плитки. Вы можете сохранить обработанные изображения для включения в пакет вашего приложения, код для этого сценария так же можно использовать для настройки изображений во время выполнения программы. Как я и сказал, очень полезно!

    Последняя возможность, касающаяся изображений, заключается в том, чтобы позволить Windows автоматически добавить строку запроса к URI http://. Эта строка запроса будет описывать текущий коэффициент масштабирования, параметры контрастности (для целей обеспечения доступности приложений), и языка. Это позволяет веб-сервисам соответствующим способом подготовить изображение, избавляя приложение от необходимости самостоятельно поддерживать все эти особенности. Как описано в материале "Схема плитки" ( http://msdn.microsoft.com/library/windows/apps/br212859.aspx), в особенности, для элемента image (http://msdn.microsoft.com/library/windows/apps/br230844.aspx ), эту опцию указывают, устанавливая атрибут addImageQuery элемента image в значение true (это так же поддерживается для элементов visual и binding):

        // Форма XmlDocument
        var tileImageAttributes = tileXml.getElementsByTagName("image");
        tileImageAttributes[0].setAttribute("addImageQuery", "true");
    
        // Форма XML-строки (другие строки кода опущены)
        var tileXmlString = /* ... */ "<image id='1' addImageQuery="true" src='ms-appx:///images/redWide.png'/>" /* ... */
    
        // При использовании Notifications Extensions Library (смотрите Сценарий 9 в примере)
    
        var tileContent = NotificationsExtensions.TileContent.TileContentFactory
        .createTileWideImageAndText01();
        tileContent.image.src = "ms-appx:///images/redWide.png";
        tileContent.image.addImageQuery = true;

    Во всех этих случаях добавленная строка будет иметь такую форму:

    ?ms-scale=<scale>ms-contrast=<contrast>ms-lang=<language>

    Здесь <scale> принимает значения 80, 100, 140, или 180, <contrast> принимает значения ), в том числе и то, как локализовать текст обновления.

    Врезка: Размер файлов PNG против JPEG

    Если говорить об изображениях для больших масштабов в 140% и 180%, кодировка, которую вы используете для изображений может оказать серьезное влияние и позволить, чтобы изображения не превысили лимит в 200 Кб. В Главе 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript" мы видели, что прямоугольная широкая плитка при 180% масштабе занимает 558x270 пикселей, а квадратная – 270x270 пикселей. В случае с прямоугольной плиткой, обычная фотография в формате PNG легко превысит лимит в 200 Кб.

    Я столкнулся с этим, когда добавлял в "Here My Am!" поддержку плитки, где я сделал уменьшенную версию текущего фотоснимка в папке локальных данных приложения и использовал URI ms-appdata:///local в полезных данных XML. Сначала я позаимствовал код из Сценария 10 примера "Плитки и индикаторы событий приложения", с которым мы здесь работали, для создания PNG-файла из элемента img с использованием временного canvas и API для работы с большими двоичными объектами. Все это хорошо работало для размера изображения плитки в 270х270 (для масштаба 180%, которое может быть уменьшено), но для размера в 558х270 файл оказался слишком большим. Тогда я взял код из Сценария 3 примера "Простая работа с изображениями" (http://code.msdn.microsoft.com/windowsapps/Simple-Imaging-Sample-a2dec2b0 ) для того, чтобы напрямую перекодировать StorageFile для текущего изображения в формат JPEG, где сжатие гораздо лучше и не нужно использовать временный canvas. Этот код находится в функции transcodeImageFile в pages/home/home.js, подпрограмма, которую мы перепишем в Главе 6 с использованием C# в компоненте WinRT.

    Подобные соображения, безусловно, важны для сервисов, которые обрабатывают параметры addImageQuery для целей масштабирования. Для изображений больших размеров, возможно лучше всего остановиться на формате JPEG, для того, чтобы размер изображения оставался в пределах лимита в 200 Кб.

    Брэндинг

    Если вы – один из тех людей, кому нравится читать документацию по схемам XML (такую, как "Схема плитки" (http://msdn.microsoft.com/library/windows/apps/br212859.aspx ), о которой я недавно упоминал), вы могли заметить еще один атрибут для элементов visual и binding , который называется branding. Он может быть установлен в значения none, logo (по умолчанию), или name для указания того, следует ли поместить на плитку маленький значок компании или краткое имя, и то и другое описывается в манифесте приложения. Сценарий 5 примера "Плитки и индикаторы событий приложения" позволяет вам поэкспериментировать с этими вариантами.

    Другие части манифеста, которые влияют на побновление плитки – это параметры Текст переднего плана (Foreground Text) и Цвет фона(Background Color) в разделе Интерфейс приложения (Application UI). Они определяют, как будет отображаться текст при всех обновлениях плитки (и всплывающие уведомления), и они не могут быть изменены в полезных данных плитки. Это позволяет сохранить однородность в брендировании приложения между обновлениями. Пользователь, вероятно, будет сбит с толку, если разные плитки одного и того же приложения будут иметь разные цвета.

    В качестве быстрого примера, пример из SDK, с которым мы здесь работаем, использует светлый текст переднего плана и фоновый цвет #00b2f0. Если я перейду в Сценарий 5, выберу шаблон TileWideText09, добавлю немного текста и выберу значок (logo) для брендинга, (где маленький значок содержит изображение с надписью "SDK"), результат будет следующим:

    Циклические и запланированные обновления, обновления со сроком действия

    Хотя вы могли прочитать заголовок этого раздела и подумать, что это – куча случайных слов, все это, на самом деле, означает, что мы разбираемся с дополнительными методами объекта ) и повторно рассматриваем два свойства объекта TileNotification, которые мы уже упоминали. Проще говоря, сейчас, когда мы уже посмотрели, как выполнять основные операции по обновлению плиток, мы готовы к тому, чтобы разобраться с дополнительными возможностями. Повторюсь, все, о чем идет здесь речь, применимо ко всем плиткам в

    Для начала, вот возможность программной очистки всех обновлений и сброса плитки в ее состояние по умолчанию, соответствующему определению в манифесте. Это происходит при простом вызове TileUpdater.clear (показано в Сценарии 1):

     Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication().clear();

    Следующая возможность, как уже упомянуто, это установка свойства TileNotification.expirationTime перед отправкой уведомления TileUpdater.update. Это гарантирует, что локальное уведомление будет автоматически удалено, и позволяет вам переопределять трехдневный период по умолчанию для обновлений, полученных из облака. Обновление появится немедленно (то есть, при следующем обновлении плитки) и затем будет удалено после того, как истечет его срок. Это показано в Сценарии 7 примера – отправка обновления с датой истечения срока действий приведет к отображению обновления, как на левом рисунке ниже. Когда срок истечет, обновление будет удалено, что приведет к тому, что плитка вернется в свое исходное состояние, как показано справа (и, да, я работаю над этим материалом в воскресенье вечером!):

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

    ). Но, что на самом деле различается, так это то, что мы берем любой XmlDocument , который мы создали, наполнив его полезными данными с помощью любого из рассмотренных ранее, и создаем уведомление с указанием времени его доставки. Вот выборка из кода файла примера js/scenario1.js:

        // Пространство имен переменной
        var Notifications = Windows.UI.Notifications;
    
        // Задержка во времени доставки, взятая из элемента управления примера
        var dueTimeInSeconds = parseInt(document.getElementById("futureTimeBox").value);
    
        // Реальные дата и время доставки
        var currentTime = new Date();
        var dueTime = new Date(currentTime.getTime() + dueTimeInSeconds * 1000);
    
        // Здесь мы создаем XmlDocument в переменной tileDOM
    
        // Теперь создадим обновление с датой доставки
        var futureTile = new Notifications.ScheduledTileNotification(tileDOM, dueTime); 
        Notifications.TileUpdateManager.createTileUpdaterForApplication().addToSchedule(futureTile);

    За исключением этих небольших изменений, все остальное, касающееся обновления плитки такое же, как раньше.

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

    Что происходит, если вы запланируете серию обновлений, которые активизируются в одно и то же время? В примере "Запланированные обновления", например, отправьте серию обновлений плитки, которые должны произойти через 10 секунд и быстро пройдите на Начальный экран чтобы увидеть результаты. Эти обновления будут появляться одно за другим, и одно из них может быть потеряно, если другое запланировано вместе с ним. Как только будет выполнено последнее обновление, оно просто будет оставаться на месте до истечения, очистки плитки или поступления нового обновления.

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

    Динамические плитки поддерживают циклический показ до пяти обновлений, где длительностью каждого из них управляет система для того, чтобы сохранять единообразие на Начальном экране. Для того, чтобы включить эту возможность, сначала вы должны вызвать ), для того, чтобы отключить циклический показ уведомлений, его нужно вызвать с параметром false. Сама по себе очередь устроена по принципу "первый вошел – первый вышел (FIFO, вы не можете иным способом контролировать порядок показа обновлений), в итоге, самое старое уведомление удаляется, если добавляется новое, когда очередь содержит максимальное количество элементов. Другими словами, если вы активируете очередь и отправляют уведомления как обычно, пять самых свежих циклически отображаются на плитке.

    Может возникнуть необходимость выборочно заменить присутствующие в очереди уведомления вместо того, чтобы полагаться на FIFO-поведение (или вызвать TileUpdater.clear и повторно отправить уведомления, которые вы хотите оставить). Это – цель свойства tag (тег) в TileNotification и ScheduledTileNotification. Свойство tag, повторюсь, это строка длиной до 16 символов, которая просто идентифицирует конкретное обновление. Если очередь включена, новое обновление с любым заданным параметром tag заменит любое обновление с тем же tag, уже присутствующее в очереди. Если такого тега в элементах очереди нет, обновление заменит самое старое в очереди. Таким образом, например, новостное приложение может иметь пять тегов для разных категорий новостей, таких, например, как world, local, politics, business, и health. Биржевое приложение, очевидно, может использовать теги для разных биржевых символов акций. Похожим образом, приложение, предоставляющее информацию о погоде может использовать теги обновлений в виде почтовых индексов или других идентификаторов расположения.

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

    Обновления индикаторов событий

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

    Индикаторы событий – это просто маленькие значки, глифы – число из одной-двух цифр, или один из некоторого количества символов, которые появляются на плитке вне зависимости от другой деятельности по ее обновлению. Они применяются для оповещения о состоянии приложения, а не для отображения некоторого содержимого, поэтому, наподобие названия или логотипа, они не анимируются вместе с другими обновлениями. Однако, изменения индикатора анимируются особым образом, с использованием WinJS.UI.Animations.updateBadge, как было кратко показано в Главе 5 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".

    То, как можно отправить индикаторы событий на плитку, по структуре напоминает обновление плитки. Начинают с создания полезной нагрузки для ), или с использованием Notifications Extensions Library, которая содержит полную поддержку индикаторов событий. В случае с индикаторами событий, это перебор, говорить об XML-"документе", так как он содержит лишь один элемент, badge, с одним атрибутом, value, для которого можно задать число – от 1 до 99 (все, что больше, отображается как 99+), или один из 11 специальных глифов, как показано ниже. Отметим, что хотя глифы показаны здесь на синем фоне, их реальный цвет зависит от Цвета фона (Background Color) в вашем манифесте:

    Если хотите, можете использовать функцию ) для получения XmlDocument с подобным содержимым; на странице справки по этомуметоду есть пример кода, который показывает, как это сделать. Но, так как XML здесь очень простой, так же легко создать объект из строки, использовав команду new Windows.Data.Xml.Dom.XmlDocument , а потом вызвать метод loadXml, как мы уже видели в случае с плитками.В Notifications Extensions Library так же есть методы для этого и для выполнения обновлений. Оба подхода показаны в Сценарии 6 примера "Плитки и индикаторы событий приложения".

    Как бы вы ни создали нужный объект, следующий шаг заключается в создании экземпляра BadgeNotification ( http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.badgenotification.aspx) с этим XmlDocument:

       var badge = new Windows.UI.Notifications.BadgeNotification(badgeDOM);

    Этот объект уведомления так же, как и в случае с плитками, поддерживает свойство expirationTime. Помимо этого, последний шаг заключается в вызове ) для получения ) для плитки приложения, или – вы вполне можете это предсказать - ) для получения BadgeUpdater для дополнительной плитки с заданным tileId. После того, как вы получите BadgeNotification (повторюсь, здесь может помочь Notifications Extensions Library), затем вы вызываете BadgeUpdate.update:

      Windows.UI.Notifications.BadgeUpdateManager.createBadgeUpdaterForApplication()
        .update(badge);

    Или:

          Windows.UI.Notifications.BadgeUpdateManager.createBadgeUpdaterForSecondaryTile
          ( "SecondaryTile.LiveTile").update(badge); 

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

    Помимо этого, класс BadgeUpdater имеет два дополнительных метода, startPeriodicUpdate и stopPeriodicUpdate, которые присутствуют и в классе TileUpdater. А не знакомы ли они вам? Периодические обновления – это наша следующая тема, - да, я и это запланировал!

    Врезка: Сколько сетевого трафика нужно плиткам?

    Вместе с многими другими улучшениями, Task Manager (Диспетчер задач) для Windows 8 умеет отслеживать объем данных, переданных приложениями по сети для обновления плитки. Запустите Диспетчер задач, не забудьте нажать на кнопку More Details (Подробнее) в его нижней левой части, и затем выберите вкладку App History (Журнал приложений). Объем сетевого трафика, потребленный для обновления плиток показан в самой правой колонке. Здесь обычно отображаются маленькие значения, но это параметр, благодаря которому вы можете увидеть, не чрезмерны ли эти обновления.

    Страницы:

    Материалы к лекциям 4-6 Вы можете скачать здесь.

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

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

    Это изменилось с приходом Windows 8. Как недавно выразился один журналист: "Использовать Windows 8 – это все равно, что жить в доме, сделанном из Интернета. Начальный экран – блестящая инновация, огромное улучшение по сравнению с рабочим столом, замусоренным папками на других ОС, который не выполняет ничего полезного, разве что показывает фоновую фотографию. Начальный экран делает возможным быть в курсе десятка событий", - если не больше, могу я добавить! - "За пять секунд – из любого приложения, просто нажав на клавишу Windows, вы можете проверить, есть ли у вас новое электронне письмо, предстоящее дело, ненастная погода или горячие новости. Нажмите на клавишу Windows еще раз – и вы вернетесь в приложение, из которого пришли" . Он продолжает предполагать, сколько времени это заняло бы, если бы вам нужно было заходить в отдельные приложения и проверять ту же информацию, даже с использованием высокоскоростного широкополосного соединения!

    Что делает Начальный экран по-настоящему живым, так это то, что мы называем динамическими (живыми) плитками (live tiles), это ответ Microsoft на необходимость собирать вместе информацию из разных источников, в основной части среды взаимодействия пользователя и системы, среды, которая "постоянно изменяется и обновляется", как выразился тот же журналист: "так как каждая ее частица подключена к Интернету"

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

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

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

    Прежде чем продолжать. Вернитесь к разделу "Включение и выключение анимации во всей системе", в Главе 5 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", и проверьте вашу Панель управления. Если "анимация, в которой нет необходимости" будет отключена, живые плитки не будут анимироваться и вы не сможете увидеть все их возможности.

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

    В-третьих, многие возможности, о которых мы будем здесь говорить, недоступны в Имитаторе Windows, такие, как живые плитки, всплывающие уведомления и экран блокировки. Запуская примеры в Visual Studio, убедитесь в том, что используете возможности отладки в режиме Локальный компьютер (Local Machine) или Удаленный компьютер (Remote Machine).

    И, наконец, API плиток и уведомлений можно найти в Windows.UI.Notifications, что слишком длинно, чтобы писать это каждый раз. Если не упомянуто иное, предпоагается, что API WinRT, о которых мы говорим, находятся в этом пространстве имен.

    Динамичная деятельность: визуальный тур

    Когда приложение только получено из Магазина Windows и установлено на устройстве, его основная плитка, как мы уже знаем, добавляется на Начальный экран. Эта плитка может быть квадратной или прямоугольной, в зависимости от того, какие графические элементы предусмотрены разработчиком. Если приложение предоставляет изображения и для квадратных, и для прямоугольных плиток, пользователь может, используя команду панели приложения, менять ее параметры (рис. 4.1).

    (рис 4.1) Типичный Начальный экран с встроенными приложения и панелью приложения. Показанная команда (третья слева) позволяет сделать прямоугольную плитку меньше, превратив ее в квадратную. Та же команда, выполненная для квадратной плитки может выглядеть как Больше (Larger) (смотрите наложенное изображение), если приложение поддерживает прямоугольные плитки

    Когда вы устанавливаете Windows 8 на устройство, вы можете не заметить, что на Начальном экране есть что-то статичное, плитки для нескольких встроенных приложений (наподобие Weather (Погода), News (Новости) и Bing) обновляются, но большая их часть статична. Но как только вы запутсите некоторые из этих приложений – что займет у вас пару секунд! – начальный экран начнет отображать больше изменяющейся информации, многие плитки будут меняться каждые несколько секунд, как я попытался показать на рис. 4.2. и рис. 4.3. Это происходит потому, что приложениям нужно запуститься хотя бы раз для того, чтобы установить первоначальные связи со связанными с ними веб-сервисами и активировать свои динамические плитки .

    (рис 4.2) Начальный экран после запуска некоторых из встроенных приложений и выполнения некоторых настроек, наподобие подключения приложения People (Люди) к моей учетной записи в Facebook (рис 4.3) Тот же самый экран через несколько секунд после того, как некоторые приложения обновили свои плитки

    Список того, что может появиться на каждой плитке, довольно обширен и разнообразен. Как вы можете видеть на предыдущих рисунках, квадратные и прямоугольные плитки могут отображать текст, изображения, название приложения или логотип (в нижнем левом углу) и другие маленькие значки (глифы), или числа, которые называются индикаторами событий (badge) в нижнем правом углу (на плитках приложения Mail (Почта) и Store (Магазин) на рис. 4.3, например).

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

    (рис 4.4) Панель приложения для Начального экрана при выделении плитки. Команда Turn live tile off (Отключить динамические плитки) отключит обновление для конкретной плитки, поэтому постарайтесь не докучать пользователям излишним "шумом"!

    Плитки могут принимать обновления даже тогда, когда приложение не запущено (как мы увидим в следующем разделе: "Четыре источника для обновлений и оповещений". Плитки так же могут циклически отображать до пяти обновлений. Это важная возможность, которая сокращает общее число обновлений, которое необходимо получить из Интернета (а значит, экономится энергия). То есть, циклически отображая различные свежие данные, плитка продолжает выглядеть работающей даже если получает обновления с интервалом в 5 – 15 минут, вместо 5 – 15 секунд.

    Совет. Хотя динамические плитки можно обновлять часто, используя push-уведомления, будьте осторожны и не злоупотребляйте этой возможностью. Рассматривайте динамические плитки как средства просмотра содержимого приложения, а не как гаджеты: избегайте попыток реализовать в живой плитке функции приложения (вроде часов), так как вы не можете положиться на высокочастотные обновления. Более того, обновление плиток состоит лишь из XML, который задает содержимое плитки – обновления не могут вызывать выполнение какого-либо кода. В конце концов, думайте о реальном опыте взаимодействия, который вы хотите предоставить посредством динамической плитки, и используйте самый длительный период обновления, который возможно, при котором эта цель достижима.

    Во Введении я упоминал, что благодаря установке большего количества приложений из Магазина Windows возможности Начального экрана стремительно растут. Но новые приложения – это не единственный способ, благодаря которому на экране может появиться больше плиток. Приложения так же могут создавать вторичные плитки, поддерживающие все возможности плиток приложения. Вторичные плитки – это обычный способ создавать закладки на страницы приложения. Вторичная плитка обычно создается с помощью команды Закрепить (Pin) на панели приложения. По запросу приложения на создание плитки, Windows автоматически запрашивает согласие пользователя, как показано для приложения Weather (Погода) на рис. 4.5, таким образом, пользователь всегда контролирует Начальный экран (таким образом, приложения не могут его замусорить!). В данном случае приложение Weather (Погода) позволяет вам закреплять дополнительные плитки для каждого расположения, параметры которого вы настроили. Дополнительная плитка всегда включает в себя специфическую информация, которая передается приложению, когда оно запускается, позволяя ему отобразить нужную страницу.

    (рис 4.5) Закрепление дополнительной плитки приложения Weather (Погода) с использованием команды Закрепить на начальном экране (Pin to start), показанное здесь с автоматическим запросом на подтверждение операции

    В приложении People (Люди), похожим образом, вы можете закрепить, то есть, создать дополнительную плитку, для конкретного человека. В приложении Mail (Почта) вы можете закрепить различные учетные записи и папки. В Internet Explorer можно выполнять закрепление на начальном экране любимых веб-сайтов. У вас есть идея: дополнительные плитки позволяют вам заполнять Начальный экран весьма персонализированными представлениями из разных приложений. Пользователь может так же открепить любую плитку приложения в любое время (в том числе – и основную плитку, что может произойти, когда кто-то создал несколько дополнительных плиток для получения доступа к конкретным частям программы). Приложение так же может запросить открепление плитки у Windows, в ответ система выдаст запрос на подверждения этого действия пользователем.

    Совет для пользователя. Возможно, вы знаете, что вы можете перемещать плитки по Начальному экрану в различные его разделы. Но знаете ли вы, что вы так же можете создавать заголовки групп для этих разделов? Для того, чтобы это сделать, выполните операцию семантического масштабирования на Начальном экране (жест сжатия, Ctr+вращение колеса мыши, или Ctrl+клавиша со знаком "-"), выберите группу и воспользуйтесь командой Назвать группу (Name group) на панели приложения:

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

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

    В качестве дополнительного материала по живым плиткам, посмотрите материал "Обновление живых иконок без разрядки аккумулятора" (http://blogs.msdn.com/b/b8_ru/archive/2011/11/09/updating-live-tiles.aspx ) в блоге разработчиков Windows 8. Это хороший материал о том, как, с точки зрения системы, эффективно управлять плитками.

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

    >По этой причине – для отображения обычной срочной информации из приложений, которые не находятся в данный момент на переднем плане – Windows 8 предоставляет всплывающие уведомления. Эти сообщения выскакивают (как настоящие тосты, но без хлебных крошек) в верхнем правом углу экрана (в верхнем левом для языков, где пишут справа налево). Они появляются поверх приложения переднего плана, как показано на рис. 4.6, так же – на Начальном экране и на рабочем столе. В одно и то же время может появиться до трех всплывающих уведомлений, и каждое может сопровождаться предопределенным звуковым сигналом, если нужно.

    Всплывающие уведомления, наподобие обновлений плиток, создают с использованием предопределенных шаблонов, они могут состоять из изображений, текста, логотипов. Они всегда использую цветовую схему связанного с ними приложения, как определено в его манифесте (установки Текст переднего плана (Foreground Text) и Цвет фона (Background Color) в разделе Интерфейс приложения (Application UI section).

    Цель всплывающих уведомления, опять же, дать пользователю сигнал или другую срочную информацию, но по умолчанию они, прежде чем исчезнуть, появляются на короткое время. Длительность показа всплывающего уведомления по умолчанию – пять секунд, но его можно установить на длительность вплоть до пяти минут в разделе Параметры ПК > Специальные возможности (PC Settings > Ease of Access), как показано на рис. 4.7. Приложения могут создавать уведомления, которые показываются долго, до 25 секунд, или в соответствии с установками в разделе Специальные возможности (Ease of Access setting), в зависимости от того, что дольше. Более того, приложения могут создавать циклически отображаемые уведомления для событий наподобие телефонного звонка или другой ситуации, в которой другой человек может ждать на другом конце линии и есть смысл сохранять активность уведомления в течение некоторого времени.

    (рис 4.6) До трех всплывающих уведомления может быть отображено поверх приложения переднего плана (в том числе – на Начальном экране и рабочем столе). Каждое уведомление, так же, может воспроизводить заданные звуковые оповещения. (рис 4.7) Настройка длительности всплывающего уведомления (выпадающий список) в разделе Параметры ПК > Специальные возможности (PC Settings > Ease of Access)

    Как и в случае с обновлениями плиток, у пользователя есть возможности полного управления всплывающими уведомлениями. Для системы в целом, для экрана блокировки и для конкретного приложения. Пользователи могут выполнить эти настройки в разделе Параметры ПК > Уведомления (PC Settings > Notifications), как показано на рис. 4.8. Это, в конечном счете, означает, что вам следует сделать ваши уведомления ценными для пользователя. Если вы показываете много ненужных уведомлений, есть вероятность, что пользователь отключит их для вашего приложения или для всей системы (и оставить плохой отзыв о вашем приложении в Магазине Windows).

    (рис 4.8) Пользователь может тонко настраивать уведомления в разделе Параметры ПК > Уведомления (PC Settings > Notifications)

    Как и в случае с дополнительными плитками, каждое всплывающее уведомление содержит специфические данные, которые будут переданы связанному с ним приложению, когда оно будет активировано. Если приложение приостановлено, конечно, Windows переключится на это приложение и вызовет его событие activated с данными из уведомления. Если приложение не исполняется, Windows запустит его. (Кстати, сочетание клавиш Win+V, циклически переводит фокус ввода между активными уведомлениями, а нажатие на Enter позволяет активировать уведомление).

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

    На самом деле, так и есть! Как мы уже видели с приложением для фонового воспроизведения музыки в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", то, что приложение, находящееся в фоновом режиме, приостановлено – это не непреложное правило . Это лишь подход Windows к экономии энергии батарей, когда она не позволяет произвольным приложениям выполняться в фоновом режиме по любым причинам. Вместо этого Windows позволяет приложениям исполнять целенаправленные фоновые задачи для конкретных целей, называемых триггерами, с учетом конкретных квот на использование ресурсов процессора и сетевого ввода-вывода. Как вы можете ожидать, приложение объявляет подобные задачи в своем манифесте.

    Триггеры предоставляют сведения об изменениях условий сетевого соединения, изменении часового пояса, об обновлениях приложении, об истечении времени таймера (с интервалом в 15 минут), или о прибытии push-уведомления из онлайнового источчника (таким образом, оповещение отправляется в ответ на события, которые являются внешними по отношению к устройству). Каждый триггер так же можно настроить с использованием условий, таких, как есть ли подключение к Интернету или нет. В любом случае, общая задача фоновых задач заключается не в том, чтобы запускать приложения – на самом деле, фоновые задачи не могут отображать произвольные пользовательские интерфейсы. Скорее, фоновые задачи позволяют приложениям обновлять свои внутренние состояния, и, когда нужно, вызывать обновления плиток или всплывающие уведомления, с помощью которых пользователь может решить активировать приложение для дальнейших действий.

    Еще один дополнительный аспект фоновых задач заключается в том, что Windows ограничивает общее количество приложений, которые могут обрабатывать определенные виды триггеров: таймеров, получения push-уведомлений, приема данных из сети по каналу управления, как используется приложениями для общения в реальном времени. Ограничение накладывает по той причине, что подобные приложения должны быть добавлены на экран блокировки для того, чтобы их задачи могли исполняться.

    Экран блокировки, как вы, конечно, знаете, и как показано на рис. 4.9, это то, что отображается тогда, когда пользователь должен войти в систему. Устройство может быть либо заблокировано пользователем, либо может сделать это самостоятельно, через некоторое время неактивности. Исключение – для тех случаев, когда приложение отключает автоматическое блокирование посредством API Windows.System.Display.DisplayRequest, как показано в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".

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

    Тем не менее, Windows не принуждает пользователя к входу в систему лишь для того, чтобы увидеть самые важные сведения из его самых важных приложений. Посредством Параметров ПК (PC Settings), как показано на рис. 4.10., пользователь может добавить до семи приложений на экран блокировки (при условии, что эти приложения запросили доступ, что является предметом решения пользователя). Эти приложения должны зарегистрировать для работы на экране блокировки соответствующие фоновые задачи, с помощью которых они осуществляют обновление индикаторов событий на экране блокировки. Именно их вы видите вдоль нижней части экрана на рис. 13.9, где каждый глиф индикатора (число) так же соответствует монохромному изображению, которое называется Индикатор событий (Badge Logo) в манифесте приложения. Эти изображения должны иметь размеры 24x24 для 100%, 33x33 для 140%, и 43x43 длы 180%, и они должны содержать только белые или прозрачные пиксели.

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

    (рис 4.10) Настройка экрана блокировки и приложений экрана блокировки в разделе Параметры ПК (PC Settings)

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

    Четыре источника для обновлений и уведомлений

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

    (рис 4.11) Локальные обновления от исполняющегося приложения (running app) вступают в силу немедленно

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

    (рис 4.12) Назначенными уведомлениями управляет система. Они появляются в запрошенное время, независимо от состояния исходного приложения

    Третий способ отправки обновлений, которым может пользоваться приложение, на этот раз – только для плиток и индикаторов событий – это периодические обновления. Как показано на рис. 4.13, исполняющееся приложение, если в этом есть необходимость, может настроить системные средства обновления плиток и индикаторов уведомлений для запроса обновления с заданного URI веб-сервиса в определенные интервалы с невысокой частотой (минимум – 30 минут), начиная с заданного времени. Веб-сервис отвечает на данный HTTP-запрос в формате XML, что аналогично тому, что исполняющееся приложение предоставляет при локальном обновлении, и обновления могут быть установлены с указанием даты и времени истечения, в итоге они автоматически удаляются из цикла обновлений, когда это нужно. Среди всех этих возможностей, периодические обновления полностью подходят многим приложениям для создания очень динамичных живых плиток со сравнительно небольшими усилиями.

    (рис 4.13) Периодические обновления для плиток и индикаторов событий регистрируются в системном средстве обновления плиток, которое запрашивает обновления с веб-сервиса с постоянной периодичностью

    Конечно, минимальный интервал в 30 минут может быть недостаточно быстрым, если приложение хочет оповестить о чем-либо пользователя так быстро, как это возможно. Поэтому у нас есть четвертое средство для обновлений – push-уведомления – и этот метод подходит как для плиток и всплывающих уведомлений, так и для уведомлений, не имеющих отношения к пользовательскому интерфейсу (необработанные уведомления, raw notifications).

    Push-уведомления, это уведомления, которые отправляются напрямую на устройство, не по запросу приложения, а по запросу некоторого веб-сервиса, который обычно круглосуточно осуществляет мониторинг информации или каких-то особых условий. Как показано на рис. 4.14, этот веб-сервис задействует бесплатный Windows Push Notification Service (WNS для краткости) для отправки уведомлениям, которые создали канал для этой цели. Каждый канал предназначен для индивидуального пользователя и устройства. Как и в случае с другими обновлениями, эти требуют хотя бы одного запуска приложения, так как в течение этого запуска приложение настраивает WNS-канал для данного устройства.

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

    (рис 4.14) Push-уведомления исходят из веб-сервисов, которые работают всегда и затем направляются службе WNS для доставки конкретным клиентам (конкретному приложению на конкретном пользовательском устройстве) посредством зарегистрированных приложениями WNS-каналов

    Полезную сводку по всем этим механизмам обновления можно найти в материале "Выбор способа доставки уведомлений" (http://msdn.microsoft.com/library/windows/apps/Hh779721.aspx ). Сюда вклюыены примеры использования каждого метода. В любом случае, сейчас мы готовы к тому, чтобы узнать подробности о том, как применять каждый из этих методов для того, чтобы поддерживать систему в динамичном состоянии активного диалога с пользователем.

    Плитки, дополнительные плитки и индикаторы событий

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

    Сейчас я предлагаю вам обратиться к Главе 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript" и просмотреть раздел "Основы брендинга приложений: экран-заставка и другие визуальные элементы", где говорится о том, как различные данные манифеста влияют на плитки, например, параметры Краткое имя (Short Name) и Показывать имя (Show Name). В данном разделе так же говорится о том, что нужно помнить о необходимости предоставления значков, рассчитанных на различное масштабирование разрешения.. Даже если вы запустите обновление плиток как только будет открыто ваше приложение, статические плитки будут важны для оказания первого впечатления на пользователя, сразу после того, как приложение будет установлено из Магазина Windows. Статические плитки так же нужны, так как именно их будет видеть пользователь, если отключит обновление вашей динамической плитки или у всех обновлений на вашей плитке истечет срок актуальности. Таким образом, даже если вы планируете использовать динамические плитки, не забудьте позаботиться о качественном дизайне статических плиток.

    Использование квадратных и прямоугольных статических плиток позволяет вам отправлять обновления динамических плиток и на те и на другие, в том числе – на квадратные и прямоугольные дополнительные плитки. В обоих случаях, постарайтесь подумать о том, что пользователю особенно хотелось бы видеть на плитках. Когда пользователи выбирают прямоугольную широкую плитку, они хотят, чтобы ваша плитка занимала больше места на Начальном экране, очевидно, что они желают видеть некоторые подробности, которые добавляют ценности данным на Начальном экране. Если пользователи выбирают, с другой стороны, квадратную плитку, они, возможно, больше заинтересованы лишь в самых необходимых сведениях: в сведениях о количестве новых сообщений электронной почты (что выводится с помощью индикатора событий), например, вместо первых строк из этих сообщений, или о текущей температуре в выбранном месте вместо расширенного прогноза погоды

    "Руководство и контрольный список для плиток и индикаторов событий" (http://msdn.microsoft.com/library/windows/apps/hh465403.aspx ) содержит довольно обширное руководство по этим темам вместе с рекомендациями по использованию зрачков, названий, индикаторов событий и обновлений. Вот полезный материал в блоге разработчиков Windows: "Эффективное использование плиток" (http://blogs.msdn.com/b/windowsappdev_ru/archive/2012/04/20/10296004.aspx ). Здесь можно узнать о том, как обновления и индикаторы событий отправляются на плитку, в этот процесс включено то, что называется XML-шаблоном плитки, предопределенная XML-конфигурация, которую вы заполняете текстом, изображениями, задаете другие свойства. Эти шаблоны применимы ко всем формам плиток и методам обновления, которые мы скоро рассмотрим. Для начала, однако, посмотрим, как управлять дополнительными плитками, так как все, о чем мы будем говорить после этого, в равной степени применимо ко всем плиткам приложения.

    Примечание API для работы с плитками и уведомления обычно распложены в Windows.UI.Notifications, за исключением тех из них, которые используются для создания вторичных плиток и находятся в Windows.UI.StartScreen. Если не указано иное, предполагается, что API, о которых мы говорим, находятся именно в пространстве имен Windows.UI.Notifications. Таким образом, мы не будем всякий раз указывать его.

    Дополнительные плитки

    Дополнительные (вспомогательные) плитки напоминают закладки для приложения, для достижения того, что еще называется глубоким связыванием (deep linking): способом запуска приложения в определенном состоянии или с открытием конкретной страницы. Дополнительные плитки позволяют пользователю персонализировать свой Начальный экран с помощью конкретных представлений приложения. Как отмечено в материале "Руководство и контрольный список для вспомогательных плиток" (http://msdn.microsoft.com/library/windows/apps/hh465398.aspx ) (я настоятельно рекомендую почитать этот материал), предоставление возможности создания дополнительных плиток – это хорошая идея, когда у вас есть состояния приложения, которые могут быть полезной целью или пунктом назначения при его запуске. Не создавайте, однако, дополнительные плитки, для статического содержимого или для использования их как виртуальных командных кнопок – это лишь научит ваших пользователей тому, что им не следует беспокоиться о том, чтобы закреплять на Начальном экране плитки из вашего приложения.

    Приложение создает дополнительную плитку в ответ на команду Закрепить (Pin), которая обычно включается в его панель приложения (с использованием значка WinJS.UI.AppBarIcon.pin). Предложите эту команду, когда приложение отображает содержимое, которое имеет смысл закрепить на Начальном экране, или если пользователь сделал соответствующее выделение. Скрывайте или отключайте команду, если содержимое или выделения не подходят для закрепления. Вдобавок, меняйте ее на команду Открепить (Unpin), если содержимое уже закреплено. Для того, чтобы узнать подробности об управлении командами панели приложения, обратитесь к Главе 1 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".

    Когда активирована команда Закрепить (Pin), приложение делает запрос на создание плитки. Затем Windows запрашивает согласие пользователя, как показано ранее на рис. 4.5.

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

    Создание дополнительных плиток

    Процесс создания дополнительной плитки в ответ на команду закрепления довольно прост: сначала создается экземпляр объекта Windows.UI.StartScreen.SecondaryTile ( http://msdn.microsoft.com/library/windows/apps/windows.ui.startscreen.secondarytile.aspx) с необходимыми свойствами, затем вызывается либо его метод requestCreateAsync , либо метод requestCreateForSelectionAsync. Если пользователь подтвердил создание плитки, она будет добавлена на Начальный экран и обработчик завершения получит аргумент с результатом операции true. Если пользователь закрыл всплывающее окно (прикоснувшись к экрану за его пределами), обработчик завершения будет вызван с результатом false. Обработчик ошибки для этих методов будет вызван, если возникнет исключение, например, если вы не предоставите необходимые свойства для SecondaryTile.

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

  • SecondaryTile() Создает SecondaryTile со свойствами по умолчанию.
  • SecondaryTile(tileId) Инициализирует SecondaryTile заданным ID, что обычно используется когда объект создается перед обновлением или при откреплении плитки.
  • SecondaryTile(tileId, shortName, displayName, arguments, tileOptions, logo) Создает SecondaryTile со всеми свойствами, необходимыми для квадратной плитки.
  • SecondaryTile(tileId, shortName, displayName, arguments, tileOptions, logo, wideLogo) Создает SecondaryTile со всеми необходимыми свойствами для широкой прямоугольной плитки.
  • Эти опции очевидным образом соотносятся со следующими свойствами объекта SecondaryTile, каждое из которых необходимо, когда вы вызываете метод requestCreate*, (за исключением опции wideLogo, которая нужна только при создании прямоугольной плитки):

  • tileId Уникальная строка (максимум 64 алфавитно-цифровых знаков, включая "." и "_"), которая идентифицирует плитку в пакете приложения. Вам это понадобится, когда вы захотите обновить или удалить плитку, и это свойство всегда должно быть установлено. Это значение обычно из содержимого, связанного с плиткой. Если вы создаете дополнительные плитки с tileId, которое уже существует, новая плитка займет место старой.
  • shortName Текстовая строка (максимум – 40 символов), которая инициализирует содержимое имени плитки, как показано на рис. 4.5. Оно отображается непосредственно на плитке, но может быть изменено пользователем до создания плитки. Когда плитка создана, это значение содержит строку, которая на ней отображается.
  • displayName Отображаемое имя плитки, которое будет показано в всплывающей подсказке к плитке, напротив приложения в списке Начального экрана Все плитки (All Tiles) и в некоторых других местах в Windows. Оно может быть любой необходимой длины и может содержать любые символы.
  • arguments Строка, которая передается обработчику активации приложения при активации дополнительной плитки.
  • ), которые могут быть скомбинированы с помощью оператора | (побитовое OR). Опции включают в себя следующие значения: none (по умолчанию), showNameOnLogo (отображать shortName на квадратной плитке), showNameOnWideLogo (отображать shortName на прямоугольной плитке), и copyOnDeployment (показывает, что дополнительная плитка должна перемещаться в облако и копироваться на другие устройства, когда текущий пользователь устанавливает приложение, которому принадлежит плитка).
  • logo URI для изображения квадратной плитки. Здесь можно использовать локальную схему ms-appx:/// или ms-appdata:///. Помните о том, что не следует хранить динамически создаваемое изображение во временном хранилище и постарайтесь не удалить его до тех пор, пока существует плитка, ссылающаяся на это изображение.
  • wideLogo URI для изображения прямоугольной плитки, опять же, здесь можно использовать локальные схемы ms-appx:/// и ms-appdata:///.
  • Вы можете, конечно, модифицировать любое из этих свойств после создания объекта )), ), либо dark, либо light), и smallLogo (снова, URI с локальной схемой ms-appx:/// или ms-appdata:///). Два других свойства, lockScreenBadgeLogo и lockScreenDisplayBadgeAndTileText, связаны с дополнительной плиткой на экране блокировки. Мы вернемся к этому позже в разделе "Фоновые задачи и приложения экрана блокировки", в частности, в подразделе "Задачи, зависимые от экрана блокировки и триггеры"

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

    Методы requestCreate* так же имеют пару вариантов, которые позволяют вам управлять расположением всплывающего окна для получения подтверждения пользователя (рис. 4.5). Сам по себе вызов requestCreateAsync приводит к размещению по умолчанию, в нижнем углу экрана. Однако, обычно лучше, чтобы это всплывающее окно появилось поближе к элементу управления команды, которая вызвала его. Для этой цели requestCreateAsync принимает необязательный параметр Windows.Foundation.Point, задающий место расположения нижнего правого угла всплывающего элемента.

    У ), которое показывает, где, по отношению к этому прямоугольнику, должен появиться всплывающий элемент: выше (above), ниже (below), слева (left), и справа (right).

    Вы можете поэкспериментировать со всеми этими опциями в примере "Дополнительные плитки" (http://code.msdn.microsoft.com/windowsapps/Secondary-Tiles-Sample-edf2a178 ). Сценарии 1 и 2 демонстрируют закрепление и открепление плитки с использование кнопок, расположенных на полотне приложения, соответственно. Сценарий 7 делает то же самое с помощью кнопок на панели приложения. Мы увидим некоторые другие сценарии в следующих разделов. В данный момент функция закрепления в Сценарии 1 (js/pintile.js) демонстрирует процесс создания плитки с использованием requestCreateForSelectionAsync:

    function pinSecondaryTile() {
    var Scenario1TileId = "SecondaryTile.Logo";
    var uriLogo = new Windows.Foundation.Uri(
    "ms-appx:///images/SecondaryTileDefault-sdk.png");
    var uriSmallLogo = new Windows.Foundation.Uri(
    "ms-appx:///images/smallLogoSecondaryTile-sdk.png");
    
    // Создание аргументов активации...
    var currentTime = new Date();
    var newTileActivationArguments = Scenario1TileId + " WasPinnedAt=" + currentTime;
    
    var tile = new Windows.UI.StartScreen.SecondaryTile(Scenario1TileId,
    "Title text shown on the tile",
    "Name of the tile the user sees when searching for the tile",
    newTileActivationArguments,
    Windows.UI.StartScreen.TileOptions.showNameOnLogo, uriLogo);
    
    // Установка других параметров
    tile.foregroundText = Windows.UI.StartScreen.ForegroundText.dark;
    tile.smallLogo = uriSmallLogo;
    
    var selectionRect = document.getElementById("pinButton").getBoundingClientRect();
    
    tile.requestCreateForSelectionAsync(
    { x: selectionRect.left, y: selectionRect.top, width: selectionRect.width,
    height: selectionRect.height },
    Windows.UI.Popups.Placement.below)
    .done(function (isCreated) {
    if (isCreated) {
    // Плитка была успешно создана
    } else {
    // Плитка не была создана
    }
    });
    }
        

    Примечание. Как упомянуто в Главе 1 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", показ системного всплывающего элемента при создании дополнительной плитки (и при удалении, смотрите "Управление дополнительными плитками" ниже), приводит к потере фокуса приложением и к автоматическому закрытию панели приложения, не находящейся в режиме залипания. По этой причине Сценарий 7 примера о дополнительных плитках поддерживает панель приложения видимой, устанавливая ее свойство sticky в значение true перед вызовом API для работы с дополнительными плитками.

    Активация приложения с помощью дополнительной плитки

    Дополнительные плитки предоставляют способ активации приложения с переводом в состояние, которое отличается от состояния по умолчанию. Это похоже на то, как аргументы командной строки работают с классическими приложениями рабочего стола или с консольными программами. Этот процесс полностью зависит от содержимого свойства arguments дополнительной плитки. Когда пользователь касается дополнительной плитки или щелкает по ней мышью, вызывается событие приложения activated с видом активации launch и со значением свойства дополнительной плитки arguments в eventArgs.detail.arguments. Затем приложение предпринимает действия, предписываемые этими данными, такие, как перемещение на конкретную страницу содержимого, получение фрагмента содержимого из онлайнового источника и так далее. В примере о дополнительных плитках, код активации в файле js/default.js перемещается к странице Сценария 5, мы передаем arguments как параметр для WinJS.Navigation.navigate:

    function activated(eventObject) {
    if (eventObject.detail.kind ===
    Windows.ApplicationModel.Activation.ActivationKind.launch) {
    if (eventObject.detail.arguments !== "") {
    // Аргументы активации присутствуют (они заданы, когда
    // дополнительная плитка была закреплена)
    eventObject.setPromise(WinJS.UI.processAll().done(function () {
    // Перемещение к странице Scenario 5, где пользователю будут показаны
    // аргументы активации
    return WinJS.Navigation.navigate(scenarios[4].url, eventObject.detail.arguments);
    }));
    } else {
    // Активация по умолчанию
    }
    }
    }
        

    Элемент управления страницы (js/LaunchedFromSecondaryTile.js) принимает строку аргументов в параметре options и для метода processed и для метода ready. В примере эта строка просто выводится на экран:

    var page = WinJS.UI.Pages.define("/html/LaunchedFromSecondaryTile.html", {
    processed: function (element, options) {
    if (options) {
    document.getElementById("launchedFromSecondaryTileOutput").innerHTML += "
      " + "App was activated from a secondary tile with the following activation" +
      "arguments : " + options + "
         ";
    }
    },
    ready: function (element, options) {
    });
        

    Ваше собственно приложение, конечно, будет делать с arguments что-нибудь гораздо более интересное!

    Управление дополнительными плитками

    В дополнение к методам и свойствам для создания дополнительных плиток, класс SecondaryTile имеет два статических метода для управления дополнительными плитками приложения:

    exists ( http://msdn.microsoft.com/library/windows/apps/windows.ui.startscreen.secondarytile.exists.aspx) Возвращает логическое значение, показывающее существует ли на Начальном экране дополнительная плитка, идентифицируемая ее свойством tileId. Это сообщает вам о том, заменит ли метод requestCreate*, вызванный с тем же самы tileId существующую плитку другой. Это показано в Сценарии 4 примера о дополнительных плитках.

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

    В дополнение, есть и несколько методов для работы с конкретным экземпляром SecondaryTile:

  • requestDeleteAsync и requestDeleteForSelectionAsync Непосредственные аналоги, с теми же вариантами размещения, что и в методах requestCreate*, удаление дополнительной плитки (открепление) так же требует согласия пользователя. Это показано в Сценариях 2 и 7 примера.
  • updateAsync Применяет к объекту SecondaryTile изменения свойств после того, как плитка была закреплена на Начальном экране. Это можно видеть в Сценарии 8 примера.
  • Если вы внимательно читали этот раздел, вы могли заметить, что я еще не упоминал Сценарий 6 примера. Это потому, что он показывает, как сделать дополнительную плитку динамической плиткой с возможностью обновления. Для того, чтобы это понять, нам нужно разобраться с обновлениями, так как используемый механизм обновлений сходен для всех плиток. Это будет следующей нашей темой. – я так и планировал!

    Основы обновлений плиток

    Локальное обновление для плитки, как было описано выше в этой лекции, это обновление, которое приложение выполняет, когда оно исполняется. На самом деле, это один из лучших моментов для отправки обновлений, так как весьма вероятно, что у приложения уже есть информация для обновления любых своих плиток. Во множестве случаев, особенно, когда приложение не связано с веб-сервисом, информация, нужная для динамических плиток приложения доступна лишь во время исполнения программы. Игра, например, может отправить обновления, показывающие лучшие результаты, новые соревнования, сведения о прохождении игры и другие виды интригующих приглашений, побуждающих пользователя снова запустить приложение. (Должен отметить, что лично для меня это отлично работает с игрой Fruit Ninja.)

    Процесс отправки локального обновления плитки довольно прост, он использует API в пространстве имен Windows.UI.Notifications:

  • Создать полезные данные XML (XML Payload), как это называют, которые описывают обновление в объекте ). XML должен всегда соответствовать одному из предопределенных шаблонов плитки. Вы можете начать с XmlDocument, предоставленного системой, создать его с нуля, или использовать Notifications Extensions Library (Библиотеку расширений уведомлений), которая предоставляет объектную модель и подсказки IntelliSense для нее.
  • Создать объект ) с этим XML. XML становится свойством content объекта TileNotification и может быть установлен отдельно.
  • При необходимости, установить свойства expirationTime и tag объекта TileNotification. По умолчанию, локальные обновления не имеют срока давности и удаляются лишь при поступлении более свежих обновлений или тогда, когда применяется операция очистки. Установка expirationDate приведет к их удалению в заданное время. (Срок уведомлений, поступивших из облака, автоматически истекает через три дня). Свойство tag – это строка из 16 или меньшего количества символов, которая используется для управления стеком обновлений, которые циклически отображаются на плитке. Подробнее об этом – немного позже.
  • Вызвать ) для получения объекта ), который связан с плиткой вашего приложения. Вызвать ) (задумайтесь над этим именем!) для получения объекта TileUpdater для дополнительной плитки с заданным tileId.
  • Вызвать TileUpdater.update с вашим объектом TileNotification. (Анимация, которая используется при отображении поступившего обновления похожа на WinJS.UI.Animation.createPeekAnimation, которая описана в Главе 5 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript").
  • Совет. Если вы отправляете обновления или другие уведомления, когда ваше приложение исполняется, подумайте о том, чтобы отправлять обновления и в обработчике события resuming, если вы не собираетесь использовать другие средства, наподобие периодических обновлений или push-уведомлений для обновления плитки. С тех пор, когда приложение было приостановлено, может пройти немало времени, поэтому возобновление работы приложения – это хорошая возможность для отправки обновлений.

    Обратимся теперь к примеру "Плитки и индикаторы событий приложения" ( http://code.msdn.microsoft.com/windowsapps/App-tiles-and-badges-sample-5fc49148) для того, чтобы увидеть, как обновления выглядят в коде. Так как имитатор Visual Studio не поддерживает динамические плитки и всплывающие уведомления, не забудьте запустить пример с опциями Локальный компьютер (Local Machine) или Удаленный компьютер (Remote Machine).

    Предполагая, что у нас есть XMLDocument с обновлением в переменной tileXml, отправка обновления занимает лишь две строчки кода (смотрите js/sendTextTile.js):

    var tileNotification = new Windows.UI.Notifications.TileNotification(tileXml);
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication()
    .update(tileNotification);
        

    Похожим образом выглядит обновление дополнительных плиток в Сценарии 6 примера "Дополнительные плитки" (js/SecondaryTileNotification.js):

    var tileNotification = new Windows.UI.Notifications.TileNotification(tileXml);
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForSecondaryTile(
    "SecondaryTile.LiveTile").update(tileNotification);
        

    Гораздо более интересный вопрос заключается в том, как мы создаем переменную tileXml, содержащую полезные данные, в первом случае. Этот процесс включает в себя использование одного из предопределенных визуальных шаблонов плитки, и затем выбор метода для создания XMLDocument. Тогда мы увидим, как использовать изображения при обновлениях, а так же, как применять рекомендацию по брендированию. Локализация и обеспечение доступности – это дополнительные соображения, касающиеся обновления плиток, но мы вернемся к этим темам в Главе 6.

    Выбор шаблона плитки

    Первый шаг в создании обновления плитки заключается в выборе подходящего шаблона из "Каталога шаблонов плиток" ( http://msdn.microsoft.com/library/windows/apps/hh761491.aspx). Здесь вы найдете описания, изображения и XML для 10 доступных квадратных шаблонов и 36 прямоугольных шаблонов. Да, всего 46 разных шаблонов (надеюсь, вы понимаете, почему я не показываю здесь их все!). Некоторые – только текстовые, некоторые – графические, некоторые и с текстом и с изображением (только для прямоугольных плиток), и здесь представлено множество шаблонов, называемых обзорными (peek) шаблонами. Эти шаблоны, если вы на них взглянете на вышеупомянутой странице , составлены из двух частей, каждая из которых имеет размер всей плитки, как показано ниже для квадратной плитки (слева) и прямоугольной (справа):

    С помощью обзорных шаблонов вы можете показать вдвое больше содержимого, чем с помощью ругих. Когда обзорное обновление отображается на динамической плитке, верхняя часть появляется сразу, и затем плитка переворачивается, или дает вам возможность "взглянуть" на нижнюю часть, и затем снова переключается на верхнюю часть, после чего динамическая плитка переключается к следующему обновлению в цикле, если оно есть (Приложение Travel (Путешествия) использует обзорные шаблоны, если вам нужен пример. Анимация, которая здесь применяется, похожа на WinJS.UI.Animation.createPeekAnimation.). Конечно, обе части должны содержать связанные данные, так как они являются частями единичного обновления.

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

    Во-вторых, изображения ограничены размером в 1024x1024 и максимальным размером в 200 Кб. Если любое изображение превышает данные лимиты, все обновление не будет отображено. Очевидно, лучше стараться не использовать большие изображения, если это возможно, так как подобные изображения лишь повышают уровень потребления памяти и возможную нагрузку на сеть (если выполняется загрузка изображения). Так же, для изображений на плитках, полезно принимать во внимание коэффициенты масштабирования 80%, 100%, 140%, и 180%. Однако, если вы не хотите работать с отдельными коэффициентами масштабирования, создайте изображение для плитки для масштаба в 180% и позвольте системе уменьшить его (здесь используется высококачественный алгоритм, поэтому изображение будет выглядеть так же хорошо, как если бы вы уменьшили его с помощью ПО для редактирования фотографий). Кроме того, для фотографий, рассмотрите использование JPEG вместо PNG, так как первый обладает лучшими возможностями по сжатию подобных изображений.

    В-третьих, если вы работаете с изображениями, которые не соответствуют итоговому соотношению сторон, изображения будут масштабированы по ширине и обрезаны сверху и снизу. Отметим так же, что соотношение сторон прямоугольной плитки, не в точности 2:1. При 100% прямоугольная плитка имеет размеры 310x150 пикселей, что означает, что изображение, занимающее ее половину, будет иметь размеры в 155x150 пикселей (не вполне квадратное) и изображение в режиме просмотра коллекций (верхний правый угол правого изображения выше) будет 77.5x75.

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

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

    Сценарий 5 примера "Плитки и индикаторы событий приложения" показывает пример очень полезного дизайна и инструмента для экспериментирования с плитками, как показано на рис. 4.15. Эта часть примера скорее представляет собой инструмент, нежели код, который можно использовать в своем приложении. Его средства позволяют вам просто экспериментировать со всеми шаблонами и их содержимым, включая изображения, получаемые из локальных и удаленных источников, без необходимости каждый раз писать для этого код. Он так же позволяет вам испытать различные возможности брендинга приложений и отправки результата в качестве обновления на плитку примера на Начальном экране.

    (рис 4.15) Сценарий 5 примера "Плитки и индикаторы событий приложения" представляет собой инструмент для испытаний различных шаблонов плиток

    Создание полезных данных, Метод 1: заполнение содержимого шаблона

    Первый способ создания полезных данных XML для заданного шаблона заключается в использовании метода ), которому вы передаете имя шаблона (значение из TileTemplateType (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.tiletemplatetype.aspx )). Это показано в Сценарии 1 примера (js/sendTextTile.js):

    function sendTileTextNotificationWithXmlManipulation() {
    var tileXml = Windows.UI.Notifications.TileUpdateManager.getTemplateContent(
    Windows.UI.Notifications.TileTemplateType.tileWideText03);

    Этот метод возвращает объект XmlDocument, который содержит структуру XML для шаблона, но никакого содержимого. Если вы запустите пример и просмотрите tileXml сразу после вышеприведенного вызова, он будет содержать лишь следующее – элементы, но не данные:

    <tile>
       <visual>
         <binding template="TileWideText03">
           <text id="1"></text>
         </binding>
       </visual>
     </tile>

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

    var tileAttributes = tileXml.getElementsByTagName("text");
    tileAttributes[0].appendChild(tileXml.createTextNode(
    "Hello World! My very own tile notification"));

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

    var squareTileXml = Windows.UI.Notifications.TileUpdateManager.getTemplateContent(
    Windows.UI.Notifications.TileTemplateType.tileSquareText04);
    var squareTileTextAttributes = squareTileXml.getElementsByTagName("text");
    squareTileTextAttributes[0].appendChild(squareTileXml.createTextNode(
    "Hello World! My very own tile notification"));
    
    var node = tileXml.importNode(squareTileXml.getElementsByTagName("binding").item(0), true);
    tileXml.getElementsByTagName("visual").item(0).appendChild(node);
    Теперь все готово для того, чтобы отправить обновление плитке:
    // отправка уведомления плитке приложения
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication()
    .update(tileNotification);
    }

    Отметим, что элементы visual в XML поддерживают version (версии) атрибутов, значение по умолчанию которых равняется 1. Это поможет поддерживать будущие изменения, где добавленные элементы с более новыми версиями XML, чем та, что сейчас поставляется в Windows 8, просто будут игнорироваться. Схему, которая применяется в плитках, если вам интересно, можно найти на странице "Схема плитки" ( http://msdn.microsoft.com/library/windows/apps/br212859.aspx).

    Создание полезных данных, Метод 2: XML-строки

    Вместо того, чтобы вызывать TileUpdateManager.getTemplateContent для получения XmlDocument с содержимым шаблона, вы просто можете создать нужный XmlDocument напрямую, из строки. Это очень похоже на создание элементов в DOM с помощью использования innerHTML вместо использования DOM API. Это предусматривает уменьшение общего количества вызываемых функций для создания необходимых полезных данных и хорошо подходит для предварительного задания большого количества почти полностью заполненых вариантов обновлений

    Этот метод прост. Задайте XML-строку с содержимым для обновления, создайте новый XmlDocument, и воспользуйтесь его методом loadXml для превращения строки в полезные данные. В Сценарии 1 мы видим, как это реализуется для создания тех же полезных данных, что и в предыдущем разделе:

    function sendTileTextNotificationWithStringManipulation() {
    // создадим строку с XML-шаблоном плитки
    var tileXmlString = "<tile>
      "
      + "<visual>
        "
        + "<binding template='TileWideText03'>
          "
          + "<text id='1'>Hello World! My very own tile notification</text>"
          + "
        </binding>"
        + "<binding template='TileSquareText04'>
          "
          + "<text id='1'>Hello World! My very own tile notification</text>"
          + "
        </binding>"
        + "
      </visual>"
      + "
    </tile>";
    
    var tileDOM = new Windows.Data.Xml.Dom.XmlDocument();
    tileDOM.loadXml(tileXmlString); // Хорошая мысль – поместить это в блок try/catch
    
    var tile = new Windows.UI.Notifications.TileNotification(tileDOM);
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication()
    .update(tile);
    }

    Очевидно, этот метод очень просто, но имеет недостаток, требуя ручной обработки. Кроме того, его сложнее отлаживать. (Поиск мелких ошибок в строках не относится к моему любимому времяпрепровождению!). К счастью, есть и еще один метод: Notifications Extensions Library, который предоставляет простоту использования строк с высоким уровнем надежности.

    Создание полезных данных, Метод 3: Notifications Extensions Library

    Третье средство создания необходимого XmlDocument для обновления плитки заключается в использовании того, что называется Notifications Extensions Library(Библиотека расширений уведомлений). Это WinRT-компонент, написанный на C#, который включен во многие примеры SDK, в том числе и в пример "Плитки и индикаторы событий приложения", который мы здесь рассматриваем. (Отметим, он включен в Ссылки (References) проекта.). Мы посмотрим на структуру подобных компонентов в Главе 5. Вероятнее всего эта библиотека в будущем войдет в состав Windows API, поэтому мы рекомендуем разработчикам использовать ее.

    Библиотека упрощает заполнение шаблонов посредством свойств объекта, а не методов XmlDocument, и, так как она отлично протестирована в Microsoft, она гораздо более надежна, чем создание XmlDocument с использованием строк. Вот, как она используется в Сценарии 1 для создания, еще раз, тех же самых полезных данных, которые мы уже видели:

    function sendTileTextNotification() {
     var tileContent =
     NotificationsExtensions.TileContent.TileContentFactory.createTileWideText03();
     tileContent.textHeadingWrap.text = "Hello World! My very own tile notification";
    
     var squareTileContent = NotificationsExtensions.TileContent.TileContentFactory
     .createTileSquareText04();
     squareTileContent.textBodyWrap.text = "Hello World! My very own tile notification";
     tileContent.squareContent = squareTileContent;
    
     Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication()
     .update(tileContent.createNotification());
     }

    Проще говоря, объект библиотеки TileContentFactory предоставляет методы для создания объектов, эквивалентных XML-документам, предоставлеяемых TileUpdateManager.getTemplateContent. Как показано в вышеприведенном коде, эти объекты имеют свойства, эквивалентные каждому из полей шаблона и когда вы готовы передать данные в TileUpdater.update, вы просто вызываете метод createNotification.

    Другая причина, по которой существует эта библиотека – это упрощение процесса создания ASP.NET веб-сервисов для периодических обновлений и push-уведомлений (где в уведомлении можно отправить обновление для плитки, обновления индикатора событий и всплывающие уведомления). Вместо создания полезных данных XML вручную – ненадежный и подверженный ошибкам подход – сервис может использовать Notifications Extensions Library для простого и последовательного создания XML для всех этих уведомлений.

    Так как объектная модель библиотеки четко описывает XML, ей очень просто пользоваться. Вот еще один материал в документации на эту тему: "Краткое руководство: использование библиотеки ). И примеры, которые мы рассматриваем в этой лекции, показывают большинство вариантов ее использования.

    Использование локальных изображений и изображений, полученных из веб

    Сценарий 1 примера, как мы уже видели, показывает обновление плиток с использованием текста, но гораздо интереснее, когда в обновления входят и изображения. Они могут поступать либо из пакета приложения, локальных данных приложений, или из веб, с использованием, соответственно, таких URI, как ms-appx:///, ms-appdata:///local, и http://. Эти URI просто назначены атрибутам src элементов image в шаблонах плиток. (Это именно image, а не img, как в HTML). Снова отметим, что первые два URI обычно имеют три слэша в начале для указания на "текущее приложение". Для URI http:// требуется объявления в манифесте приложения возможности Интернет (Клиент) (Internet (Client)).

    Сценарий 2 примера (js/sendLocalImage.js) показывает использование ms-appx:/// для изображения внутри пакета приложения, с вариантами для всех трех методов создания полезных данных, которые мы уже видели. При использовании методов XmlDocument, настройка источника изображения выглядит так:

      var tileImageAttributes = tileXml.getElementsByTagName("image");
        tileImageAttributes[0].setAttribute("src", "ms-appx:///images/redWide.png");
        Notifications Extensions Library дает нам свойства, которым мы можем присваивать URI:
        var tileContent = NotificationsExtensions.TileContent.TileContentFactory
        .createTileWideImageAndText01();
        tileContent.textCaptionWrap.text = "This tile notification uses ms-appx images";
        tileContent.image.src = "ms-appx:///images/redWide.png";

    А при использовании XML-строк, вы можете включить URI напрямую в элемент image.

    Сценарий 3 (js/sendWebImage.js) показывает то же самое, за исключением того, что вы можете использовать URI http://. Это хороший способ увидеть воздействие указания изображений, которые имеют различные соотношения сторон, как и тех, которые превышают разрешенные размеры в 1024 пикселя и размер файла в 200 Кб. Как вы можете увидеть, в подобных случаях обновления просто не отображаются.

    Что касается URI ms-appdata:///local (перемещаемые и временные расположения не разрешены), его использование показано в Сценарии 8, где вы можете выбрать изображение с помощью средства выбора файлов и пример копирует его в папку локальных данных приложения. Затем на него, в составе полезных данных обновления, ссылаются как на файл, по URI ms-appdata:///local (js/imageprotocols.js):

        tileContent = NotificationsExtensions.TileContent.TileContentFactory.createTileWideImage();
        tileContent.image.src = "ms-appdata:///local/" + imageRelativePath;

    Тот же сценарий позволяет вам экспериментировать с URI, указывающими на изображения в пакете и удаленные изображений, что позволяет реализовать инструментарий, представленный в Сценарии 5. Я так же обновил мое приложение "Here My Am!" для этой лекции (в материалах к лекции), добавил обзорный шаблон плитки с обновлением, которое содержит свежие изображения и расположения. Смотрите врезку "PNG против JPG" ниже.

    Если говорить об инструментах и изображениях, посмотрите так же Сценарий 10 в SDK-примере. Он даст вам еще один полезный инструмент для обновления файлов, где вы можете обрезать и настроить изображения в соответствии с различнй плотностью пикселей так, чтобы эти изображения хорошо подходили к выбранному шаблону плитки. Вы можете сохранить обработанные изображения для включения в пакет вашего приложения, код для этого сценария так же можно использовать для настройки изображений во время выполнения программы. Как я и сказал, очень полезно!

    Последняя возможность, касающаяся изображений, заключается в том, чтобы позволить Windows автоматически добавить строку запроса к URI http://. Эта строка запроса будет описывать текущий коэффициент масштабирования, параметры контрастности (для целей обеспечения доступности приложений), и языка. Это позволяет веб-сервисам соответствующим способом подготовить изображение, избавляя приложение от необходимости самостоятельно поддерживать все эти особенности. Как описано в материале "Схема плитки" ( http://msdn.microsoft.com/library/windows/apps/br212859.aspx), в особенности, для элемента image (http://msdn.microsoft.com/library/windows/apps/br230844.aspx ), эту опцию указывают, устанавливая атрибут addImageQuery элемента image в значение true (это так же поддерживается для элементов visual и binding):

        // Форма XmlDocument
        var tileImageAttributes = tileXml.getElementsByTagName("image");
        tileImageAttributes[0].setAttribute("addImageQuery", "true");
    
        // Форма XML-строки (другие строки кода опущены)
        var tileXmlString = /* ... */ "<image id='1' addImageQuery="true" src='ms-appx:///images/redWide.png'/>" /* ... */
    
        // При использовании Notifications Extensions Library (смотрите Сценарий 9 в примере)
    
        var tileContent = NotificationsExtensions.TileContent.TileContentFactory
        .createTileWideImageAndText01();
        tileContent.image.src = "ms-appx:///images/redWide.png";
        tileContent.image.addImageQuery = true;

    Во всех этих случаях добавленная строка будет иметь такую форму:

    ?ms-scale=<scale>ms-contrast=<contrast>ms-lang=<language>

    Здесь <scale> принимает значения 80, 100, 140, или 180, <contrast> принимает значения ), в том числе и то, как локализовать текст обновления.

    Врезка: Размер файлов PNG против JPEG

    Если говорить об изображениях для больших масштабов в 140% и 180%, кодировка, которую вы используете для изображений может оказать серьезное влияние и позволить, чтобы изображения не превысили лимит в 200 Кб. В Главе 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript" мы видели, что прямоугольная широкая плитка при 180% масштабе занимает 558x270 пикселей, а квадратная – 270x270 пикселей. В случае с прямоугольной плиткой, обычная фотография в формате PNG легко превысит лимит в 200 Кб.

    Я столкнулся с этим, когда добавлял в "Here My Am!" поддержку плитки, где я сделал уменьшенную версию текущего фотоснимка в папке локальных данных приложения и использовал URI ms-appdata:///local в полезных данных XML. Сначала я позаимствовал код из Сценария 10 примера "Плитки и индикаторы событий приложения", с которым мы здесь работали, для создания PNG-файла из элемента img с использованием временного canvas и API для работы с большими двоичными объектами. Все это хорошо работало для размера изображения плитки в 270х270 (для масштаба 180%, которое может быть уменьшено), но для размера в 558х270 файл оказался слишком большим. Тогда я взял код из Сценария 3 примера "Простая работа с изображениями" (http://code.msdn.microsoft.com/windowsapps/Simple-Imaging-Sample-a2dec2b0 ) для того, чтобы напрямую перекодировать StorageFile для текущего изображения в формат JPEG, где сжатие гораздо лучше и не нужно использовать временный canvas. Этот код находится в функции transcodeImageFile в pages/home/home.js, подпрограмма, которую мы перепишем в Главе 6 с использованием C# в компоненте WinRT.

    Подобные соображения, безусловно, важны для сервисов, которые обрабатывают параметры addImageQuery для целей масштабирования. Для изображений больших размеров, возможно лучше всего остановиться на формате JPEG, для того, чтобы размер изображения оставался в пределах лимита в 200 Кб.

    Брэндинг

    Если вы – один из тех людей, кому нравится читать документацию по схемам XML (такую, как "Схема плитки" (http://msdn.microsoft.com/library/windows/apps/br212859.aspx ), о которой я недавно упоминал), вы могли заметить еще один атрибут для элементов visual и binding , который называется branding. Он может быть установлен в значения none, logo (по умолчанию), или name для указания того, следует ли поместить на плитку маленький значок компании или краткое имя, и то и другое описывается в манифесте приложения. Сценарий 5 примера "Плитки и индикаторы событий приложения" позволяет вам поэкспериментировать с этими вариантами.

    Другие части манифеста, которые влияют на побновление плитки – это параметры Текст переднего плана (Foreground Text) и Цвет фона(Background Color) в разделе Интерфейс приложения (Application UI). Они определяют, как будет отображаться текст при всех обновлениях плитки (и всплывающие уведомления), и они не могут быть изменены в полезных данных плитки. Это позволяет сохранить однородность в брендировании приложения между обновлениями. Пользователь, вероятно, будет сбит с толку, если разные плитки одного и того же приложения будут иметь разные цвета.

    В качестве быстрого примера, пример из SDK, с которым мы здесь работаем, использует светлый текст переднего плана и фоновый цвет #00b2f0. Если я перейду в Сценарий 5, выберу шаблон TileWideText09, добавлю немного текста и выберу значок (logo) для брендинга, (где маленький значок содержит изображение с надписью "SDK"), результат будет следующим:

    Циклические и запланированные обновления, обновления со сроком действия

    Хотя вы могли прочитать заголовок этого раздела и подумать, что это – куча случайных слов, все это, на самом деле, означает, что мы разбираемся с дополнительными методами объекта ) и повторно рассматриваем два свойства объекта TileNotification, которые мы уже упоминали. Проще говоря, сейчас, когда мы уже посмотрели, как выполнять основные операции по обновлению плиток, мы готовы к тому, чтобы разобраться с дополнительными возможностями. Повторюсь, все, о чем идет здесь речь, применимо ко всем плиткам в

    Для начала, вот возможность программной очистки всех обновлений и сброса плитки в ее состояние по умолчанию, соответствующему определению в манифесте. Это происходит при простом вызове TileUpdater.clear (показано в Сценарии 1):

     Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication().clear();

    Следующая возможность, как уже упомянуто, это установка свойства TileNotification.expirationTime перед отправкой уведомления TileUpdater.update. Это гарантирует, что локальное уведомление будет автоматически удалено, и позволяет вам переопределять трехдневный период по умолчанию для обновлений, полученных из облака. Обновление появится немедленно (то есть, при следующем обновлении плитки) и затем будет удалено после того, как истечет его срок. Это показано в Сценарии 7 примера – отправка обновления с датой истечения срока действий приведет к отображению обновления, как на левом рисунке ниже. Когда срок истечет, обновление будет удалено, что приведет к тому, что плитка вернется в свое исходное состояние, как показано справа (и, да, я работаю над этим материалом в воскресенье вечером!):

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

    ). Но, что на самом деле различается, так это то, что мы берем любой XmlDocument , который мы создали, наполнив его полезными данными с помощью любого из рассмотренных ранее, и создаем уведомление с указанием времени его доставки. Вот выборка из кода файла примера js/scenario1.js:

        // Пространство имен переменной
        var Notifications = Windows.UI.Notifications;
    
        // Задержка во времени доставки, взятая из элемента управления примера
        var dueTimeInSeconds = parseInt(document.getElementById("futureTimeBox").value);
    
        // Реальные дата и время доставки
        var currentTime = new Date();
        var dueTime = new Date(currentTime.getTime() + dueTimeInSeconds * 1000);
    
        // Здесь мы создаем XmlDocument в переменной tileDOM
    
        // Теперь создадим обновление с датой доставки
        var futureTile = new Notifications.ScheduledTileNotification(tileDOM, dueTime); 
        Notifications.TileUpdateManager.createTileUpdaterForApplication().addToSchedule(futureTile);

    За исключением этих небольших изменений, все остальное, касающееся обновления плитки такое же, как раньше.

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

    Что происходит, если вы запланируете серию обновлений, которые активизируются в одно и то же время? В примере "Запланированные обновления", например, отправьте серию обновлений плитки, которые должны произойти через 10 секунд и быстро пройдите на Начальный экран чтобы увидеть результаты. Эти обновления будут появляться одно за другим, и одно из них может быть потеряно, если другое запланировано вместе с ним. Как только будет выполнено последнее обновление, оно просто будет оставаться на месте до истечения, очистки плитки или поступления нового обновления.

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

    Динамические плитки поддерживают циклический показ до пяти обновлений, где длительностью каждого из них управляет система для того, чтобы сохранять единообразие на Начальном экране. Для того, чтобы включить эту возможность, сначала вы должны вызвать ), для того, чтобы отключить циклический показ уведомлений, его нужно вызвать с параметром false. Сама по себе очередь устроена по принципу "первый вошел – первый вышел (FIFO, вы не можете иным способом контролировать порядок показа обновлений), в итоге, самое старое уведомление удаляется, если добавляется новое, когда очередь содержит максимальное количество элементов. Другими словами, если вы активируете очередь и отправляют уведомления как обычно, пять самых свежих циклически отображаются на плитке.

    Может возникнуть необходимость выборочно заменить присутствующие в очереди уведомления вместо того, чтобы полагаться на FIFO-поведение (или вызвать TileUpdater.clear и повторно отправить уведомления, которые вы хотите оставить). Это – цель свойства tag (тег) в TileNotification и ScheduledTileNotification. Свойство tag, повторюсь, это строка длиной до 16 символов, которая просто идентифицирует конкретное обновление. Если очередь включена, новое обновление с любым заданным параметром tag заменит любое обновление с тем же tag, уже присутствующее в очереди. Если такого тега в элементах очереди нет, обновление заменит самое старое в очереди. Таким образом, например, новостное приложение может иметь пять тегов для разных категорий новостей, таких, например, как world, local, politics, business, и health. Биржевое приложение, очевидно, может использовать теги для разных биржевых символов акций. Похожим образом, приложение, предоставляющее информацию о погоде может использовать теги обновлений в виде почтовых индексов или других идентификаторов расположения.

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

    Обновления индикаторов событий

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

    Индикаторы событий – это просто маленькие значки, глифы – число из одной-двух цифр, или один из некоторого количества символов, которые появляются на плитке вне зависимости от другой деятельности по ее обновлению. Они применяются для оповещения о состоянии приложения, а не для отображения некоторого содержимого, поэтому, наподобие названия или логотипа, они не анимируются вместе с другими обновлениями. Однако, изменения индикатора анимируются особым образом, с использованием WinJS.UI.Animations.updateBadge, как было кратко показано в Главе 5 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".

    То, как можно отправить индикаторы событий на плитку, по структуре напоминает обновление плитки. Начинают с создания полезной нагрузки для ), или с использованием Notifications Extensions Library, которая содержит полную поддержку индикаторов событий. В случае с индикаторами событий, это перебор, говорить об XML-"документе", так как он содержит лишь один элемент, badge, с одним атрибутом, value, для которого можно задать число – от 1 до 99 (все, что больше, отображается как 99+), или один из 11 специальных глифов, как показано ниже. Отметим, что хотя глифы показаны здесь на синем фоне, их реальный цвет зависит от Цвета фона (Background Color) в вашем манифесте:

    Если хотите, можете использовать функцию ) для получения XmlDocument с подобным содержимым; на странице справки по этомуметоду есть пример кода, который показывает, как это сделать. Но, так как XML здесь очень простой, так же легко создать объект из строки, использовав команду new Windows.Data.Xml.Dom.XmlDocument , а потом вызвать метод loadXml, как мы уже видели в случае с плитками.В Notifications Extensions Library так же есть методы для этого и для выполнения обновлений. Оба подхода показаны в Сценарии 6 примера "Плитки и индикаторы событий приложения".

    Как бы вы ни создали нужный объект, следующий шаг заключается в создании экземпляра BadgeNotification ( http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.badgenotification.aspx) с этим XmlDocument:

       var badge = new Windows.UI.Notifications.BadgeNotification(badgeDOM);

    Этот объект уведомления так же, как и в случае с плитками, поддерживает свойство expirationTime. Помимо этого, последний шаг заключается в вызове ) для получения ) для плитки приложения, или – вы вполне можете это предсказать - ) для получения BadgeUpdater для дополнительной плитки с заданным tileId. После того, как вы получите BadgeNotification (повторюсь, здесь может помочь Notifications Extensions Library), затем вы вызываете BadgeUpdate.update:

      Windows.UI.Notifications.BadgeUpdateManager.createBadgeUpdaterForApplication()
        .update(badge);

    Или:

          Windows.UI.Notifications.BadgeUpdateManager.createBadgeUpdaterForSecondaryTile
          ( "SecondaryTile.LiveTile").update(badge); 

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

    Помимо этого, класс BadgeUpdater имеет два дополнительных метода, startPeriodicUpdate и stopPeriodicUpdate, которые присутствуют и в классе TileUpdater. А не знакомы ли они вам? Периодические обновления – это наша следующая тема, - да, я и это запланировал!

    Врезка: Сколько сетевого трафика нужно плиткам?

    Вместе с многими другими улучшениями, Task Manager (Диспетчер задач) для Windows 8 умеет отслеживать объем данных, переданных приложениями по сети для обновления плитки. Запустите Диспетчер задач, не забудьте нажать на кнопку More Details (Подробнее) в его нижней левой части, и затем выберите вкладку App History (Журнал приложений). Объем сетевого трафика, потребленный для обновления плиток показан в самой правой колонке. Здесь обычно отображаются маленькие значения, но это параметр, благодаря которому вы можете увидеть, не чрезмерны ли эти обновления.

    Вернуться к учебному плану