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

в 21:50, , рубрики: .net, mobile development, windows phone 8, возобновление работы приложения, многозадачность, разработка под windows phone

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
На этом всё, спасибо за внимание.

Примечание

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

Автор: ap3rus

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js