Главная » Разработка для Windows Phone 7 » Идеал многозадачности Windows Phone 7

0

Основной мечтой нескольких последних десятилетий было научить персональные компьютеры выполнять несколько задач одновременно. Но когда дело доходит до пользовательских интерфейсов, многозадачность становится еще более проблематичной. Резидентные программы (Terminate-and-Stay-Resident, TSR) MS-DOS и кооперативная многозадачность ранней Windows были лишь первыми робкими попытками в непрекращающейся до сих пор борьбе. Теоретически, переключать процессы легко. Но организовать совместное использование ресурсов – включая экран и целый ряд различных устройств ввода – очень сложно.

Тогда как среднестатистический пользователь, возможно, восхищается тем, с какой легкостью современная Windows может «жонглировать» множеством разных приложений одновременно, для нас, разработчиков, реализация многозадачности до сих пор является довольно сложной проблемой. Мы тщательно разрабатываем UI-потоки, чтобы обеспечить их мирное взаимодействие с потоками, не являющимися UI-потоками, всегда оставаясь настороже, ожидая скрытого вероломства асинхронных операций.

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

В Windows Phone 7 таким неуклюжим приемом является захоронение.

Переключение задач в телефоне

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

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

Вместо этого Windows Phone 7 организовывает управление множеством активных приложений через реализацию стека. В некотором смысле этот стек приложения расширяет стек страницы на все Silverlight-приложение. Телефон можно рассматривать как устаревший Веб-браузер без вкладок и кнопки Forward (Вперед). Но в нем есть кнопка Back и кнопка Start, обеспечивающая переход к экрану запуска, с которого можно запустить новое приложение.

Предположим, вы запустили приложение Analyze (Анализ). Немного поработали и решили выйти из него. Нажимаете кнопку Back. Приложение Analyze завершается, и вы возвращаетесь к экрану запуска. Это самый простой сценарий.

Позднее вы решаете запустить Analyze снова. В ходе работы с Analyze возникает необходимость проверить что-то в Интернете. Вы нажимаете кнопку Start, чтобы вернуться к экрану запуска и выбрать Internet Explorer. Во время «путешествия» по Интернету вы вдруг вспоминаете, что давно ни во что не играли. Нажимаете кнопку Start и выбираете Backgammon (Нарды). Пока вы обдумываете преимущества конкретного хода, вы снова нажимаете кнопку Start и запускаете калькулятор. Через некоторое время вас начинает мучить совесть, из-за того что вы бездельничаете, поэтому вы нажимаете кнопку Start и запускаете Draft (Проект).

Draft – это многостраничное приложение на Silverlight. С главной страницы вы переходите к другим страницам.

Теперь начинаем нажимать кнопку Back. Последовательно закрываются все страницы, находящиеся в стеке приложения Draft. Draft завершается, и вы переходите к калькулятору. В нем до сих пор отображаются какие-то результаты проводимых вами вычислений. Закрываете калькулятор и переходите к Backgammon. Игра находится в том состоянии, в котором вы ее оставили. Backgammon закрывается, и вы возвращаетесь в Internet Explorer. Опять последовательно закрываете все открытые Веб-страницы, завершаете IE. Возвращаетесь в Analyze, закрываете Analyze и опять оказываетесь на странице запуска. Теперь стек пуст.

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

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

В этом и есть суть захоронения. Приложение «убивают», но потом позволяют ему возродиться вновь.

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

Фокус в том, чтобы заставить эксгумированное приложение выглядеть и вести себя так же, как это было в момент перед его захоронением. Это можно обеспечить только во взаимодействии с Windows Phone 7. Телефон предоставляет инструменты (события и место для размещения некоторых данных); задача разработчика – использовать эти инструменты для восстановления приложения в презентабельное состояние. В идеале, пользователь не должен даже догадываться, что это совершенно новый процесс.

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

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

Теперь определимся с терминологией, которой будем пользоваться в дальнейшем:

         Если приложение вызывается с экрана запуска, мы говорим, что оно запущено.

•         Если приложение завершает свою работу в результате нажатия кнопки Back, оно завершается.

•         Если приложение выполняется, и пользователь нажимает кнопку Start, говорят, что приложение деактивировано, хотя фактически оно «мертво». Это состояние захоронения.

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

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии