День четырнадцатый. Захоронение

Вступление

Несколько слов о мультизадачности (multitasking). С самого начала появления Windows Phone пошли разговоры о многозадачности на новой платформе, точнее об ее отсутствии. Как же обстоят дела на самом деле?

Windows Phone 7 поддерживает многозадачность

Да, вы не ослышались. Аппараты под управлением Windows Phone поддерживают многозадачность в полной мере. Вы можете слушать музыку во время игры, или получать письма, посещая веб-сайты. Разговоры об отсутствии многозадачности появились, когда разработчик обнаружили, что не могут создавать собственные приложения, работающие в фоновом режиме. Но так уж нужна вам многозадочность? В большинстве случаев она совсем не нужна.

Кроме того в Windows Phone есть особый механизм Push Notification, который отчасти решает данную проблему (поговорим о нем в следующий раз).

Захоронение

А пока поговорим о другом механизме с жутким названием Захоронение (Tombstoning), который позволяет воскрешать уже убитые процессы. Вот краткая схема, как это работает:

Tombstoning

Как вы видите из иллюстрации выше, имеются два события деактивации и реактивации, сбрабатывающие, когда пользователь входит или выходит из нашей программы. Используя данные события, мы можем создать видимость для пользователя, что наше приложение не останавливалось. Когда мы познакомимся с Isolated Storage (День 15) и Push Notifications (День 19), это станет мощным оружием в наших руках.

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

Программа учета личных вещей

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

Калькулятор

Результат на калькуляторе вас немного удивил, и вы решили выйти в интернет. Снова нажимаете кнопку Start и запускаете Internet Explorer, убивая калькулятор. В поисковой системе вводите запрос: Сколько лап у кота. Переходите по ссылке на книгу Шесть лап у кошки и другие головоломки. 100 занимательных математических задач.

Шесть лап у кошки

Найденный результат нас вполне устраивает. Теперь мы делаем шаги в обратном порядке. Нажимая на кнопку Back, мы возвращаемся на первую страницу браузера. Повторное нажатие на кнопку Back закрывает Internet Explorer и выводит на экран Калькулятор. Обратите внимание, что у калькулятора по-прежнему остались наши данные подсчета. Еще раз нажимаем на кнопку Back - на этот раз открывается наша программа. Но, что это? Всё, всё, что нажил непосильным трудом — всё же погибло. Три магнитофона, три кинокамеры заграничных, три портсигара отечественных, куртка замшевая... три куртки. В нашей программе все введенные значения не сохранились, и нам снова придется заполнять форму.

Не сохраненные данные

Путешевствуя подобным образом, мы запустили, убили и воскресили пару программ. И даже ничего не заметили. Чтобы убедиться в этом, поменяйте порядок работы. Сначала запустите на эмуляторе Калькулятор и сделайте несколько расчетов. После этого запустите ваш проект, а затем браузер. Начинайте нажимать на кнопку Back, чтобы вернуться к Калькулятору. Когда вы нажмете на кнопку Back, находясь в вашей программе, то в Visual Studio увидите, что ваша программа завершила работу. Единственный недостаток у нашей программы - она не умеет сохранять результаты, как это умеет делать Калькулятор. Давайте исправим это.

Претендуя на мультизадачность

Всего имеется четыре встроенных метода в файле App.xaml.cs. Бегло просмотрим их.


// Code to execute when the application is launching (eg, from Start)
// This code will not execute when the application is reactivated
private void Application_Launching(object sender, LaunchingEventArgs e)
{
}

// Code to execute when the application is activated (brought to foreground)
// This code will not execute when the application is first launched
private void Application_Activated(object sender, ActivatedEventArgs e)
{
}

// Code to execute when the application is deactivated (sent to background)
// This code will not execute when the application is closing
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
}

// Code to execute when the application is closing (eg, user hit Back)
// This code will not execute when the application is deactivated
private void Application_Closing(object sender, ClosingEventArgs e)
{
}

Методы Launching и Closing используются в обычных случаях: для запуска и выхода из программы традиционным способом (например. закрытие программы через кнопку Back, или запуск программы через список приложений App List). Оставшиеся два метода Activated и Deactivated используются для более редких случаев. Например, используем кнопку Back для возврата к нашему приложению. Или пользователь должен ответить на поступивший звонок, поэтому вынужден временно отказаться от использования нашей программой.

Вы можете использовать данные методы для сохранения различных данных при выходе пользователем из программы и восстановления данных при повторном возвращении пользователя.


private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
	PhoneApplicationService.Current.State["LeftTime"] = DateTime.Now;
}

Сохранение состояние приложения при деактивации

Windows Phone 7 обеспечивает особый способ сохранения данных во время захоронения через свойство State класса PhoneApplicationService (пространство имен Microsoft.Phone.Shell). В свойстве State вы можете сохранить текстовые ключи (тип IDictionary<string, object>). Система сохраняет State на период, пока приложение деактивировано и захоронено, но очищает его, когда программа закрывается и завершается на самом деле.

Сохранять и загружать данные состояния приложения можно через перегруженные методы OnNavigatedTo (сохраняем данные) и OnNavigatedFrom (загружаем обратно). Первое, что нужно сделать при деактивации программы, сохранить все данные пользователя. Давайте сохраним для демонстрации количество кинокамер, которое содержится в третьем текстовом поле.

В следующем уроке мы подробнее познакомимся с изолированным хранилищем (Isolated Storage), в котором можно сохранять данные пользователя. А пока просто демонстрационный пример:


protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    // Сохраяем данные
    PhoneApplicationService.Current.State["Cameras"] = textBox2.Text;
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    // Восстанавливаем данные
    if (PhoneApplicationService.Current.State.ContainsKey("Cameras"))
    {
        textBox2.Text =  (string)PhoneApplicationService.Current.State["Cameras"];
    }
}

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

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

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

Совет: При реализации поддержки tombstoning не забудьте тщательно её протестировать. Для этого перейдите к каждой странице (с помощью эмулятора или фактического устройства), нажмите кнопку «Start», а затем нажмите кнопку «Назад». Обязательно проверьте каждое состояние каждой странице вашего приложения и убедитесь, что реактивация всегда восстанавливает состояние так, как ожидалось.

Если вы тестируете поддержку tombstoning в эмуляторе в Visual Studio в режиме отладки, вы заметите, что отладчик иногда прерывает соединение, когда вы дезактивируете ваше приложение. В этом случае приложение будет казаться зависшим на «восстанавливающейся» странице, когда вы его повторно активируете. Вы можете решить эту проблему, просто перейдя в Visual Studio и нажав F5 снова. Приложение тогда будет перезагружено и повторно активировано.

Реклама

декоративные напольные покрытия такое e-parket.com.ua массивная доска пола