Опубликован: 11.01.2013 | Доступ: свободный | Студентов: 623 / 124 | Длительность: 12:06:00
Лекция 4:

Лабораторный практикум 3

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >

Лабораторная работа №15. Сохранение состояния

Задание

Изменить приложение "Блокнот", добавив сохранение его состояния "при захоронении".

Освоение

  • сохранение состояния приложения "при захоронении"

Описание

В Windows Phone 7 только одно приложение может быть активным. Кроме того существуют т.н. свернутые приложения. Когда приложение перестает быть активным, операционная система автоматически переводит его в бездействующее состояние (dormant). В случае нехватки памяти, бездействующие приложения "захораниваются" (переходят в состояние tombstoned). Однако одновременно система сохраняет состояние tombstoned только для пяти приложений. При активации "захороненного" приложения все изменения теряются. Однако у разработчика есть возможность сохранять состояние.

Примечание. Для активации приложения следует зажать кнопку "Назад" на телефоне. В появившемся списке выбрать нужное приложение. Активировать можно приложения, находящиеся в состоянии dormant или tombstoned.

Откроем приложение "Блокнот". Добавим в него возможность восстановления из состояния "захоронения" приложения.

В коде главной страницы переопределим метод OnNavigatedFrom(). При уходе с нее, в случае если уходим не на страницу настроек, будем сохранять текст и настройки в свойстве State:

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);

            if (!e.Uri.OriginalString.Equals("/PropertiesPage.xaml"))
            {
                this.State.Add("text", txtMain.Text);

                SaveProperties();

                this.State.Add("FontSize", Properties.nFontSize);
                this.State.Add("FontFamily", Properties.strFontFamily);
                this.State.Add("Italic", Properties.bItalic);
                this.State.Add("Bold", Properties.bBold);

                this.State.Add("HAlignment", Properties.taHAlignment);
                this.State.Add("colorFont", Properties.colorFont);
                this.State.Add("colorBack", Properties.colorBack);
            }
        }

Добавим в класс глобальную переменную isNewlyCreatedPage типа bool, которой в конструкторе будем присваивать значение true. Эта переменная будет нужна для того, чтобы не восстанавливать состояние при активации бездействующих (dormant) приложений (состояние и так сохранено операционной системой).

Вынесем в отдельную функцию LoadProperties() присвоение свойствам текстового поля значений из статического класса. Изменим метод OnNavigatedTo(). Если приложение новое (или восстановленное из состояния tombstoned), и состояние было сохранено, выгружаем параметры текстового поля и очищаем свойство State. Если приложение старое, то, если мы перешли на главную страницу с другой – просто загружаем параметры, иначе ( приложение восстановлено из состояния dormant) – очищаем свойство State.

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            if (isNewlyCreatedPage)
            {
                if (this.State.ContainsKey("text"))
                {
                    txtMain.Text = (string)this.State["text"];

                    Properties.nFontSize = (int)this.State["FontSize"];
                    Properties.strFontFamily = (string)this.State["FontFamily"];
                    Properties.bItalic = (bool)this.State["Italic"];
                    Properties.bBold = (bool)this.State["Bold"];

                    Properties.taHAlignment = (TextAlignment)this.State["HAlignment"];
                    Properties.colorFont = (Color)this.State["colorFont"];
                    Properties.colorBack = (Color)this.State["colorBack"];

                    LoadProperties();

                    this.State.Clear();
                }
            }
            else
            {
                if (e.IsNavigationInitiator)
                {
                    LoadProperties();
                }
                else
                {
                    this.State.Clear();
                }
            }

            isNewlyCreatedPage = false;
        }

        private void LoadProperties()
        {
            //if (true == Properties.bApply)
            {
                txtMain.FontSize = Properties.nFontSize;
                txtMain.FontFamily = new FontFamily(Properties.strFontFamily);

                txtMain.FontStyle = Properties.bItalic ? FontStyles.Italic : FontStyles.Normal;
                txtMain.FontWeight = Properties.bBold ? FontWeights.Bold : FontWeights.Normal;

                txtMain.TextAlignment = Properties.taHAlignment;

                txtMain.Foreground = new SolidColorBrush(Properties.colorFont);
                txtMain.Background = new SolidColorBrush(Properties.colorBack);
            }
        }

Для того чтобы проверить работу новой логики, запустите приложение, измените текст и свойства текстового поля, затем нажмите кнопку "Start" телефона (кнопка с изображением значка Windows). Приложение перейдет в состояние dormant. Чтобы вернуться в приложение зажмите кнопку Back на телефоне и выберете приложение "Блокнот" Рис. 4.1 :

Приложение (Блокнот)

Рис. 4.1. Приложение (Блокнот)

Для проверки состояния tombstoned в свойствах проекта в разделе "Debug" поставьте галочку "Tombstone upon deactivation while debugging" (Рис. 4.2 ), после чего повторите вышеописанные действия:

Выбор опции (Tombstone upon deactivation while debugging)

Рис. 4.2. Выбор опции (Tombstone upon deactivation while debugging)

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >