Жизненный путь приложений для Магазина Windows: Характеристики платформы Windows 8
Устроим перерыв и немного отдохнём: Управление жизненным циклом процессов
Мы уже многое рассмотрели в первой лекции, наше приложение многое умеет, но мы еще даже не начали писать код. На самом деле, приложение может быть действительно занятым, когда оно реализует определенные стороны контрактов. Если приложение объявило себя целевым для целей поиска, общего доступа, работы с контактами или для целей средства выбора файлов в своём манифесте (среди других параметров), Windows активирует приложение в ответ на соответствующее действие пользователя. Например, если пользователь вызывает средства чудо-кнопки Общий доступ и выбирает ваше приложение в качестве целевого, Windows активирует приложение с указанием данной цели. В ответ, приложение показывает специальный интерфейс для приёма данных, или вид (view), но не всё приложение, и когда выполнение задачи завершается, Windows завершит работу приложения (или отправит его в фоновый режим, если оно уже выполняется) без необходимости в дополнительных действиях пользователя.
Автоматическое завершение работы приложения или отправка его в фоновый режим - это примеры автоматического управления жизненным циклом (lifecycle management) приложений для Магазина Windows, который позволяет сберегать электроэнергию и оптимизировать время жизни устройства от батарей. Реальность обычных многозадачных операционных систем заключается в том, что пользователь обычно имеет множество выполняющихся приложений, каждое из которых потребляет энергию. Это имеет значение для настольных приложений, так как многие из них могут быть, как минимум, частично видимыми. Но в случае с приложениями для Магазина Windows, система смело берет на себя подобную работу и использует полноэкранную сущность таких приложений для их же пользы.
Приложения обычно выполняют какую-либо работу и активны только тогда, когда пользователь видит их (в любом состоянии просмотра). Когда большинство приложений невидимы, нет особенной нужды в том, чтобы поддерживать их работу "на холостом ходу". Гораздо лучше - просто выключить их, дать им немного отдохнуть, и позволить тем приложениям, которые видимы, использовать системные ресурсы.
Итак, когда приложение уходит в фоновый режим, Windows автоматически приостанавливает (suspend) его после примерно 5 секунд (если судить по настенным часам). Приложение оповещается об этом событии, чтобы оно могло сохранить любые необходимые состояния (подробнее об этом - в следующем разделе). В этот момент приложение всё еще находится в памяти, со всеми своими структурами данных, но ему просто не выделяется процессорное время (Рис. 1.9). Это очень полезно для времени жизни устройства от батарей, так как большинство настольных приложений при бездействии напоминают автомобили, заправляемые бензином, на холостом ходу, потребляя некоторое количество ресурсов центрального процессора, если им это нужно, например, для того, чтобы перерисовать часть окна. Так как графический интерфейс приложений для Магазина Windows, находящихся в фоновом режиме, полностью скрыт, им не нужно выполнять даже такой вот небольшой работы, и они могут быть эффективно заморожены. В этом смысле, это больше похоже на современный электромобиль, который можно включать и выключать так часто, как это необходимо для того, чтобы снизить количество потребляемой им энергии.
Если пользователь, затем вернется обратно к приложению (в любом режиме просмотра, посредством любого жеста), приложение снова будет поставлено в очередь к ресурсам процессора и возобновит (resume) свою работу с того места, где она была прервана (подстроив свой макет под текущее состояние просмотра, конечно). Приложение так же оповещается об этом событии, на тот случай, если ему нужна повторная синхронизация с онлайновыми сервисами, если ему нужно обновить макет, обновить список файлов в системной библиотеке или получить новые данные от сенсора, так как с того момента, как оно было приостановлено, прошло некоторое время. Обычно, хотя приложение не нуждается в повторной загрузке своего состояния, так как оно всё это время находится в памяти.
увеличить изображение
Рис. 1.9. Последовательность состояний жизненного цикла приложения для Магазина Windows
Пользователь запускает приложение (User Launches App)
Запущенное приложение (Running App)
Возобновление (Resuming)
У приложения есть 5 секунд на обработку приостановки (App gets 5s to handle suspend)
Приложению сообщают, когда оно возобновлено (Apps are notified when they have been resumed)
Приостановленное приложение (Suspended App)
Нехватка ресурсов (Low Resources)
Остановленное приложение (Terminated App)
Приложение не оповещается перед завершением работы (App is not notified before termination)
Экран-заставка (Splash screen)
Код исполняется (Code gets to run)
Код не исполняется (No code runs)
Приложение не исполняется (App not running)
Может исполняться ограниченный набор фоновых задач (Limited Background tasks can run)
Здесь есть пара исключений. Во-первых, Windows предоставляет API для фоновой передачи данных (background transfer) - смотрите "Анатомия приложения и навигация по страницам" курса "Программная логика приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript и их взаимодействие с системой" - для того, чтобы убрать из кода приложения реализацию задач по загрузке или отправке данных, что означает, что приложения не обязаны выполняться для выполнения подобного обмена данными. Приложения так же могут попросить систему периодически обновлять живые плитки (live tiles) на Начальном экране с помощью данных, полученных от сервиса, или они могут использовать push-уведомления (push notifications) (посредством Сервиса Push-уведомлений Windows -Windows Push Notification Service, WNS), в итоге, им даже не нужно запускаться для этих целей - смотрите "Быстрый старт" курса "Программная логика приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript и их взаимодействие с системой". Во-вторых, определенные виды приложений делают что-то полезное, когда их графический интерфейс не виден. Это - аудиоплееры, программы для общения, или такие программы, которым нужно выполнить некоторые действия, когда происходит какое-то системное событие (изменилось состояние сети, пользователь вошёл в систему и так далее). В случае с аудио приложение задаёт фоновое воспроизведение аудио в манифесте (а где же еще!) и устанавливает соответствующие свойства подходящего элемента управления. Это позволяет приложению продолжать выполняться в фоновом режиме. В случае с системными событиями, как мы увидим в "Быстрый старт" курса "Программная логика приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript и их взаимодействие с системой", приложение объявляет фоновые задачи в своём манифесте, привязанные к определенным функциям в их коде. В этом случае Windows вызовет приложение из приостановленного состояния, когда произойдёт соответствующее событие. Это показано в нижней части Рис. 1.9.
С течением времени, естественно, у пользователя может скопиться довольно много программ, загруженных в память, и большинство из них будет приостановлено, потребляя очень мало энергии. Очевидно, придёт время, когда приложение переднего плана (foreground app), особенно - только что запущенное - потребует больше памяти, чем доступно в настоящий момент. В этом случае Windows автоматически прекратит работу (terminate) одного или большего количества приложений, убрав их из памяти (снова посмотрите на Рис. 1.9).
Но вот беда: до тех пор, пока пользователь явно не закроет приложение - используя комбинацию клавиш Alt+F4 или жест скольжения сверху вниз, так как политика Магазина Windows не позволяет приложениям иметь собственные команды или жесты для завершения работы - он вправе полагать, что приложение всё еще выполняется. Если пользователь снова активирует приложения (например, с его плитки), он ожидает вернуться в то же самое место приложения, где был ранее. Например, игра должна быть на том же самом месте, где и раньше (хотя, автоматически поставлена на паузу), программа для чтения должна отображать ту же самую страницу, и видео должно быть приостановлено там же, где оно проигрывалось ранее. В противном случае, представьте себе, какие оценки и отзывы будут у вашего приложения в Магазине Windows!
В итоге вы можете сказать: "Хорошо, мне лишь нужно сохранить состояние приложения, когда завершается его работа, так?". На самом деле - не так. Ваше приложение не оповещается о том, что его работа завершается. Почему? Так как в это время оно уже приостановлено, его код не выполняется. В дополнение к этому, если нужно завершить работу приложения, это происходит в условиях нехватки памяти, и последнее, что вы захотите - это чтобы ваше приложение было активировано и попыталось сохранить собственное состояние, для чего ему понадобится дополнительная память! Обязательно, как было отмечено выше, чтобы приложения сохраняло своё состояние при приостановке, и, в идеале, даже в других ситуациях в процессе нормального выполнения. Итак, посмотрим, как всё это работает.