Pull to refresh

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

Reading time3 min
Views9K
Original author: Tore Lervik
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
На этом всё, спасибо за внимание.

Примечание


В оригинальной статье отсутствовали некоторые моменты из официальной документации, которые я посчитал уместным добавить на суд читателей.
Tags:
Hubs:
Total votes 42: ↑36 and ↓6+30
Comments2

Articles