Опубликован: 10.04.2013 | Доступ: свободный | Студентов: 440 / 9 | Длительность: 16:52:00
Специальности: Программист
Лекция 2:

Состояния, параметры, файлы и документы

Перемещаемое состояние

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

Этот механизм работает очень просто. Во-первых,папка roamingFolder и контейнер roamingSettings ведут себя точно так же, как соответствующие локальные объекты. До тех пор, пока их общий размер не превышает Windows.Storage.ApplicationData.current.roamingStorageQuota , Windows будет копировать эти данные на другие устройства, на которых авторизовался тот же самый пользователь, и на которых установлено то же приложение. На самом деле, когда приложение установлено, Windows пытается скопировать перемещаемые данные, таким образом, они уже присутствуют при первом запуске приложения.

Если приложение исполняется одновременно на нескольких устройствах, выигрывают последние записанные файлы или параметры. Когда данные перемещаются, другие приложения получают событие Windows.Storage.ApplicationData.ondatachanged . Таким образом, приложение всегда загружает подходящее перемещаемое состояние при запуске и обновляет это состояние при необходимости внутри обработчика datachanged . Вам следует всегда задействовать эту стратегию, так как Windows может не загрузить сразу перемещаемое состояние для вновь установленного приложения (например, когда пользователь устанавливает приложение и связь с сетью теряется). Как только перемещаемое состояние будет доступно, приложение получит событие datachanged . Это показано в Сценарии 5 примера "Данные приложения" (http://code.msdn.microsoft.com/windowsapps/ApplicationData-sample-fb043eb2).

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

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

Для того чтобы минимизировать размер перемещаемого состояния и не превышать квоту, вы можете задействовать API Windows.Storage.Compression для данных, хранящихся в файлах. По той же причине, никогда не используйте перемещаемое состояние для пользовательских данных. Вместо этого используйте онлайновые сервисы, наподобие SkyDrive для хранения пользовательских данных в облаке и перемещайте URI для этих файлов как часть перемещаемого состояния. Больше об использовании SkyDrive посредством REST API вы сможете узнать из материала "Работа с папками и файлами Microsoft SkyDrive" (http://msdn.microsoft.com/library/live/hh826531), из материала "Основные принципы работы SkyDrive" (http://msdn.microsoft.com/library/live/hh826545.aspx) (здесь есть список поддерживаемых типов файлов), и из примера "PhotoSky" (http://msdn.microsoft.com/library/live/hh826545.aspx). Разъяснения, касающиеся этого и других сервисов Windows Live вы можете найти в блоге "Создание Windows 8", в материале "Реализация возможностей по работе с облаком в приложениях Windows 8 с помощью SkyDrive" (http://blogs.msdn.com/b/b8_ru/archive/2011/10/03/windows-8-skydrive.aspx).

Сейчас, возможно, у вас есть множество других вопросов о том, как, на самом деле, работает перемещение данных: "Как часто синхронизируются данные", "Как можно управлять различными версиями данных?", "Что еще нужно об этом знать?". Это хорошие вопросы, и, к счастью, на них есть достойные ответы!

  • Учитывая наличие сетевого соединения, перемещаемое состояние на активном компьютере обновляется каждые 30 минут. Так же перемещение происходит немедленно, когда пользователь входит в систему или блокирует компьютер. Блокирование компьютера всегда – лучший способ инициировать синхронизацию с облаком. Обратите внимание на то, что если облачные сервисы знают лишь о пользователе (то есть, об учетной записи Microsoft), имеющем лишь одно устройство, синхронизация с облачным сервисом происходит лишь раз в день. Когда сервисы получают информацию о том, что у пользователя есть несколько устройств, синхронизация происходит каждые 30 минут. Если приложение деинсталлировано со всех компьютеров кроме одного, период синхронизации увеличивается.
  • При сохранении перемещаемого состояния вы можете записывать данные в любое время, например, при их изменении. Вам не нужно заботиться о групповой записи параметров, так как у Windows есть встроенный механизм для комбинирования изменений и уменьшения общей нагрузки на сеть.
  • Если у вас есть группа параметров, которая по объективным причинам должна перемещаться как единое целое, реализуйте ее в виде взаимосвязанных параметров в контейнере roamingSettings .
  • В случае с файлами, созданными внутри roamingFolder , они не будут перемещаться до тех пор, пока они открыты для записи (то есть, до тех пор, пока открыты потоки, связанные с ними). Полезно проверить, закрыты ли все потоки при приостановке приложения.
  • Windows позволяет всем приложениям иметь до 8 Кб параметров с "высоким приоритетом", которые будут перемещены в течение одной минуты, таким образом, экземпляры приложения на нескольких устройствах оказываются лучше синхронизированными. Для того, чтобы это использовать, создайте отдельный параметр или группу взаимосвязанных параметров в корневой части roamingSettings и дайте этому объекту имя HighPriority, таким образом, мы получим roamingSettings.values["HighPriority"] (контейнер с этим именем будет перемещаться обычным образом). До тех пор, пока размер этого параметра не превышает 8 Кб, он будет перемещаться в течение минуты после изменения. Если размер будет превышен, он будет перемещаться с обычным приоритетом. Демонстрацию этого вы можете найти в Сценарии 6 примера "Данные приложения".
  • На доверенном компьютере, параметры пользователя общеситемного значения, наподобие конфигурации начальной страницы, автоматически перемещаются независимо от приложений. Они так же включают в себя зашифрованные учетные данные, которые приложения записали в хранилище учетных данных. Приложениям никогда не следует пытаться перемещать пароли. Приложения, которые создают дополнительные плитки (как мы увидим в лекции 2 курса "Программная логика приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript и их взаимодействие с системой") могут указать, следует ли копировать эти плитки на новое устройство при установке на него приложения.
  • Когда существует несколько версий данных приложения, используемых одним и тем же приложением (с несколькими версиями приложения, конечно), Windows будет управлять каждой версией данных приложения раздельно, что означает, что более новые данные приложения не переместятся на устройство с более старой версией приложения. В свете этого, полезно не применять слишком агрессивное изменение версий данных приложения, так как это может прервать связь между приложениями.
  • Облачные сервисы хранят несколько версий перемещаемых данных приложения до тех пор, пока множество версий приложения используются в рамках одной и той же учетной записи Microsoft. Только когда все экземпляры приложения будут обновлены, старая версия данных может быть удалена.
  • Когда обновленное приложение воспринимает старую версию перемещаемого состояния, ему следует загрузить его как старую версию, но сохранить – как новую и вызвать setVersionAsync .
  • Избегайте использования дополнительной схемы назначения версий внутри перемещаемого состояния, как, например, внесение структурных изменений без изменения версии данных приложения посредством setVersionAsync . Так как облачный сервис управляет перемещаемыми состояниями, основываясь на номере их версии, и так как последние записанные данные выигрывают, некоторые версии приложения, которые ожидают некоторых дополнительных данных, и, на самом деле, сохраняют эти данные, могут обнаружить, что эти данные были удалены, так как немного более старые версии приложения их не записали.
  • Даже если все экземпляры приложения были удалены с устройств пользователя, облачный сервис хранит перемещаемые данные в течение "разумного срока" (около 30 дней), таким образом, если пользователь переустановит приложение в течение этого периода, он обнаружит, что ранее заданные параметры сохранились. Для того чтобы избежать этого и явным образом удалить перемещаемое состояние из облака, воспользуйтесь методом clearAsync .

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

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

Когда пользователь нажимает на чудо-кнопку Параметры (это можно сделать и напрямую, использовав комбинацию клавиш Win + i), Windows отображает панель параметров – часть пользовательского интерфейса, которая заполнена различными командами для настройки параметров, а так же, в нижней части – системными настройками. Приложения могут добавлять собственные команды для настройки параметров, но не обязаны этого делать. Windows гарантирует, что какие-то настройки для приложения всегда будут присутствовать на этой панели: она автоматически показывает названия приложения и разработчика, команду "Отзывы и оценки", которая ведет к странице приложения в Магазине Windows, команду "Обновить", если обновление для приложения доступно в Магазине Windows, и команду "Разрешения", если приложение объявило какие-либо возможности в манифесте. (Обратите внимание на то, что команда "Отзывы и оценки" не отображается, если приложение запущено из Visual Studio, так как эта возможность предоставляется Магазином Windows).

Чудо-кнопка Параметры доступна всегда, независимо от места в приложении, где вы находились, поэтому нет нужды думать о реализации подобной команды в панели приложения, не нужна подобная команда и на холсте приложения. Тем не менее, вы можете программно активировать чудо-кнопку Параметры, когда, например, вы обнаружили, что какая-то возможность выключена и оповещаете об этом пользователя. Вы можете задать ему вопрос наподобие: "Вы хотите включить функцию определения местоположения для этого приложения?", и если он ответит "Да", вы можете активировать чудо-кнопку Параметры. Это делается посредством объекта панели параметров, полученного из Windows.UI.ApplicationSettings.SettingPane.getForCurrentView ( http://msdn.microsoft.com/library/windows/apps/windows.ui.applicationsettings.settingspane.getforcurrentview.aspx ), метод show которого отображает пользовательский интерфейс (или выдает исключение, если приложение находится в прикрепленном режиме просмотра, или не является приложением переднего плана, поэтому не выполняйте подобный вызов при таких обстоятельствах!). Свойство edge объекта панели параметров сообщает вам о том, с левой или с правой стороны экрана находится панель, в зависимости от ориентации интерфейса системы слева направо или справа налево (зависит от региональных установок).

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

Вадик Елетин
Вадик Елетин
Россия, г. Санкт-Петербург
Николай Жигульский
Николай Жигульский
Россия, Тверь, Тверской государственный технический университет