Восстановление приложения при запуске со стартового экрана без потери предыдущего состояния в WP8

от автора

Windows Phone 8 принесла такую замечательную возможность, как быстрое возобновление состояния приложения после его перезапуска из списка приложения или через плитку начального экрана с полным сохранением состояния и истории навигации внутри приложения (для возможности последующей навигации используя кнопку Назад так, как если бы приложение никуда и не сворачивалось).

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

Итак, начнем.

WMAppManifest.xml

Для начала, давайте откроем файл манифеста нашего приложения (кликнув по нему в Solution Explorer и выбрав View Source, в английской редакции Visual Studio). Все, что нам нужно сделать, это добавить в элемент DefaultTask атрибут под названием ActivationPolicy со значением Resume. Вот так:

<DefaultTask Name="_default" NavigationPage="MainPage.xaml" ActivationPolicy="Resume" /> 

По большому счету, этим изменением мы добились того, что наше приложение при перезапуске через стартовый экран/список приложений стало восстанавливаться к своему предыдущему состоянию плюс переходу на страницу, указанную в атрибуте NavigationPage элемента DefaultTask манифеста нашего приложения. Сразу после этого, история навигации нашего приложения выглядит вот так:
image
Это немного ускорило перезапуск за счет того, что система больше не очищает состояние и не запускает приложение с нуля. Но, мы идём дальше.

App.xaml.cs

Теперь мы должны отменить этот ненужный нам переход на главную страницу после перезапуска приложения. Для этого, нам нужно немножко отредактировать файл App.xaml.cs (можно заметить, что SDK почему-то не хочет работать так, как описано на MSDN, поэтому мы пойдем немного другим путём).

Для начала, давайте добавим приватное нестатическое поле типа System.Boolean в наш класс App и назовём его _reset.

private bool _reset; 

Следующим шагом, нужно найти приватный метод InitializePhoneApplication (он автоматически создается шаблоном по-умолчанию) и настроить инициализацию RootFrame, определив наши обратотчики для событий Navigating и Navigated.

RootFrame.Navigating += RootFrame_Navigating; RootFrame.Navigated += RootFrame_Navigated; 

Последним шагом будет модификация тел методов-обработчиков этих событий.

private void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e) {     if (_reset && e.IsCancelable && e.Uri.OriginalString == "/MainPage.xaml")     {         e.Cancel = true;         reset = false;     } }  private void RootFrame_Navigated(object sender, NavigationEventArgs e) {     _reset = e.NavigationMode == NavigationMode.Reset; } 

И это всё, цель достигнута. Теперь, после возобновления приложения при его перезапуске, пользователь будет попадать именно туда, откуда он покинул это приложение.
image
Можно так же дополнительно поиграться и так же очистить историю кнопки Назад при возобновлении, сохранив состояние только текущей страницы. Для этого, в обработчике события Navigated можно добавить следующую строчку:

if (e.NavigationMode == NavigationMode.Reset) while (RootFrame.RemoveBackEntry() != null); 

image
На этом всё, спасибо за внимание.

Примечание

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

ссылка на оригинал статьи http://habrahabr.ru/post/157379/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *