Лабораторный практикум 3
Лабораторная работа №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 :
Для проверки состояния tombstoned в свойствах проекта в разделе "Debug" поставьте галочку "Tombstone upon deactivation while debugging" (Рис. 4.2 ), после чего повторите вышеописанные действия: