Жизненный путь приложений для Магазина Windows: Характеристики платформы Windows 8
Вспоминая себя: Состояние приложения и перемещаемые данные
Оглядываясь назад, мы можем говорить о том, что ключевые различия между традиционными настольными приложениями и приложениями для Магазина Windows заключаются в том, что последние, по существу, сохраняют своё текущее состояние. Таким образом, будучи однажды запущенными, они помнят своё состояние между запусками (если только не были в явном виде закрыты пользователем или если не предоставляют средства для явного сбрасывания состояния к исходному). Некоторые настольные приложения работают похожим образом, но многие страдают от чего-то вроде личностного кризиса при каждом запуске. Как Златопуст Локонс из "Гарри Поттер и тайная комната", который часто начинал спрашивать себя: "Кто я?"6Для тех читателей, которые не смотрели этот фильм до самых титров, это короткая сцена в самом конце. В течение фильма, Локонс - плодовитый, самовлюблённый и обычно нечестный рассказчик о себе - потерял память от заклятия забвения. В том эпизоде он показан в смирительной рубашке на обложке своей последней книги: "Кто я?"., не имея понятия о том, где он был или что делал до этого.
Это - не очень хорошая идея для приложений Магазина Windows, жизненный цикл которых находится под автоматическим управлением. С точки зрения пользователя, приложения всегда работают, даже если, на самом деле, это не так. Поэтому критически важно, чтобы приложения в первую очередь занимались параметрами, которые постоянно воздействуют на них, и, кроме того, сохраняли бы состояние сеансов работы, когда система приостанавливает их. В итоге, если работа приложения завершается и оно перезапускается, оно может загрузить данные о состоянии сеанса работы с приложением для того, чтобы вернуться в то же место, где оно было до этого. (Приложение принимает флаг при старте, показывающий предыдущее состояние его исполнения, который определяет, что приложению следует делать с сохранённым состоянием сеанса работы. Подробнее об этом читайте в "Анатомия приложения и навигация по страницам" ).
Есть и другое изменение зависимости от предыстории. Помните, ранее в этой лекции мы говорили о том, что пользователь может установить то же самое приложение Магазина Windows на несколько, до пяти, устройств? Это означает, что приложения, в зависимости от их устройства, конечно, так же могут сохранять своё состояние между этими устройствами. То есть, если пользователь поставил на паузу игру или воспроизведение видео на одном устройстве или сделал заметку к книге или журналу на одном устройстве, пользователь совершенно естественным образом захочет получить возможность перейти на другое устройство и увидеть всё в точно таком же состоянии.
К счастью, Windows 8 упрощает это, на самом деле - значительно упрощает, благодаря автоматическому перемещению параметров и состояний приложения, вместе с параметрами Windows, между устройствами, на которых пользователь выполнил вход, используя одну и ту же учетную запись Microsoft, как показано на Рис. 1.10.
Рис. 1.10. Автоматическое перемещение перемещаемых данных приложения (содержимого папки и параметров) между устройствами
Хост-процесс приложения (App Host Process)
Контейнер приложения (App Container)
Приложения используют перемещаемые данные так, как будто это локальные данные приложения (Apps use roaming data as if it were just local appdata)
Перемещаемая папка данных и настроек приложения (AppData Roaming folder and settings)
До 100 Кб перемещаемых данных автоматически синхронизируются между устройствами, на которых установлены одинаковые приложения и на которые пользователь вошёл под одной и той же учетной записью (Roaming data (up to 100K) automatically synced between devices with same app and same user account)
Важнее всего здесь - понять, как и где приложение сохраняет свои состояния. (Мы уже знаем, когда это происходит). Если вы вспомните, есть одно место в файловой системе, к которому приложение имеет неограниченный доступ: это папка с данными приложения. Внутри этой папки Windows автоматически, при установке приложения, создаёт подпапки, которые называются LocalState (Локальное состояние), RoamingState (Перемещаемое состояние) и TempState (Временное состояние) (я обычно упоминаю их без присоединения слова "State" - "Состояние"). Приложение может программным образом работать с любой из этих папок в любое время, может создавать в них любые файлы и подпапки, соответствующие его нуждам. Существуют и API для управления индивидуальными Локальными (Local) и Перемещаемыми (Roaming) параметрами (это - пары вида "ключ - значение"), вместе с группами параметров, которые называют взаимосвязанными (composites), которые всегда записываются, считываются и перемещаются как единое целое. (Это полезно при реализации возможностей настройки параметров приложения с помощью чудо-кнопки Параметры, как показано в "Быстрый старт" курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript").
Сейчас, хотя приложение может записывать столько, сколько ему нужно, в область данных приложения (вплоть до заполнения полной ёмкости файловой системы), Windows автоматически перемещает данные из папки, хранящей перемещаемые данные только в том случае, если они соответствуют разрешенному ограничению (примерно 100 Кб, но для этого есть специальное API). Если вы превысите лимит, данные никуда не денутся, но не будут перемещаться. Кроме того, знайте, что облачное хранилище данных имеет различные лимиты на длину имён файлов и путей к файлам, так же как и на сложность структуры папок. Поэтому поддерживайте простую структуру и маленькие размеры перемещаемого состояния. Если приложению нужно перемещать большие объемы данных, используйте дополнительные веб-сервисы наподобие SkyDrive (смотрите пост в блоге: "Реализация возможностей по работе с облаком в приложениях Windows 8 с помощью SkyDrive" (http://blogs.msdn.com/b/b8_ru/archive/2011/10/03/windows-8-skydrive.aspx).
В итоге, приложению нужно принять решение о том, какие состояния являются локальными для устройства, а каким следует быть перемещаемыми. Говоря в общем, любые параметры, данные, или кэшированные ресурсы, которые специфичны для устройства, следует делать локальными (и папка для временных файлов так же локальна), в то время как параметры и данные, представляющие взаимодействие пользователя с приложением - это потенциальные кандидаты в перемещаемые данные. Например, есть приложение для работы с электронной почтой, которое поддерживает локальный кэш сообщений, может хранить его локально, но перемещать между устройствами данные аккаунта (без пароля, смотрите Совет ниже), таким образом, пользователь может сконфигурировать программу только на одном устройстве. Такой программе, возможно, следует поддерживать параметры, касающиеся загрузки или обновления сообщений, ориентированные на отдельные устройства, в итоге, пользователь сможет минимизировать сетевой или мобильный трафик на мобильных устройствах. Проигрыватель, аналогично, может хранить локальные кэши, зависящие от специфических характеристик дисплея приложения, и может перемещать плейлисты, сведения о позиции проигрывания, избранные записи и прочие подобные параметры (естественно, пользователь должен желать подобного поведения программы).
Когда сохраненное состояние перемещается, знайте, что при разрешении коллизий применяется простая политика "последний записавший побеждает". Так, если вы запустите одно и то же приложение на двух устройствах в одно и то же время, не ожидайте хитроумного объединения состояний или обмена ими. После множества тестов и анализов, инженеры Microsoft, в итоге, решили, что подобная простота лучше всего.
Здесь же я хочу сказать о том, что если пользователь устанавливает приложение, перемещающее некоторые параметры, деинсталлирует приложение, затем, через некоторое время, снова его устанавливает, пользователь обнаружит, что параметры приложения, заданные ранее, сохранены. Это имеет значение, так как было бы слишком жестоким шагом удалять перемещаемые состояния в облаке в момент, когда пользователь случайно удалит приложение на всех своих устройствах. На подобное положение нельзя полагаться, однако, Windows, вероятнее всего, будет некоторое время хранить перемещаемые состояния приложения.
Врезка: Локальные данные против временных данных
Для целей локального кэширования, приложение может использовать и папку локальных данных, и папку временных данных. Разница заключается в том, что локальные данные всегда находятся под контролем приложения. Временные данные, с другой стороны, могут быть удалены, если пользователь запустит средство очистки диска. Локальные данные, таким образом, лучше использовать для реализации функциональности приложения, а временные - для реализации оптимизации во время выполнения приложения за счет использования дискового пространства.
Для приложений Магазина Windows, написанных на HTML и JavaScript вы так же можете использовать существующий механизм кэширования, наподобие локального хранилища HTML5, IndexedDB, кэша приложения и так далее. Всё это хранится внутри папки приложения LocalState.
Врезка: Возможности лицензирования по пользователям и перемещение данных
Не вдаваясь в подробности, лично я считаю возможности платформы по перемещению данных между устройствами восхитительными, так как они позволяют разработчикам размышлять о приложении как о чём-то, находящемся выше, чем работа на одном устройстве или в одной ситуации. Как я упоминал ранее, коллекция приложений пользователя весьма специфична и она персонализирует устройство. Приложения лицензируются на пользователя, а не на устройство. Таким образом, мы, как разработчики, можем думать о каждом приложении как о чём-то, проецирующем себя соответствующим образом на любое устройство и любое окружение, в котором находится пользователь. На некоторых устройствах приложение может быть ориентировано на интенсивный ввод данных или на выполнение работы, на других оно может быть ориентировано на просмотр данных или передачу их другим пользователям. Конечный результат опыта взаимодействия с подобным приложением заключается в том, что оно лучше соответствует жизни пользователя и подходит под применение в любых ситуациях.
Пример подобного сценария показан на Рис. 1.11, где приложение может иметь различные индивидуальные особенности или разный дух в зависимости от окружения пользователя и того, как различные устройства могут быть использованы в каждой ситуации. Может показаться весьма прозаичным размышлять о приложении для планирования рациона, управления рецептами и списками покупок, но это постоянно происходит во множестве домов по всему миру. Кроме того, это то, что понравится моей жене, если я напишу больше программного кода, нежели текста!
Что касается меня, я воспринимаю это как настоящее проявление следующей эпохи персональных компьютеров, эпохи, в которой персональные вычисления распространяются гораздо дальше, чем раньше, за пределы опыта взаимодействия с отдельным устройством, всё еще включая в себя такой опыт. Устройства - это лишь окно просмотра для вашего приложения и данных, каждое из таких окон имеет собственную роль в большой истории о том, как вы перемещаетесь по миру и взаимодействуете с ним.
Чтение журналов, пометка интересных рецептов (Read magazines, mark recipes of interest)
Планирование меню с отмеченными рецептами, составление списка покупок (Plan menus with marked recipes, make shopping lists)
Просмотр списка покупок, поиск магазинов с лучшими ценами (И, да, здесь у Microsoft есть история с телефонами…) (See shopping lists, locate stores with best prices (And yes, Microsoft will eventually have a story with the phones here…))
Подготовка дневного рациона в соответствии с планом меню (а это - планшет, который можно мыть в посудомоечной машине!) (Prepare the day's meals according to menu plan (this is a dishwasher-safe tablet too!))