Восстановление информации о навигации

Последнее обновление: 13.02.2016

В прошлой главе, где рассказывалось о жизненном цикле приложения, отмечалось, что система сама, в случае нехватки ресурсов, может перевести приложение в состояние Terminated, тем самым завершив его выполнение. Это может негативно сказываться на пользовательском опыте. Ведь, даже если пользователь находился не на первой странице перед тем, как произошло завершение работы приложения, при новом запуске приложения он все равно снова окажется на самой первой странице. А хотелось бы, чтобы он продолжал работу именно с той страницей, на которой завершилось выполнение.

Чтобы выйти из этой ситуации можно сохранять и восстанавливать историю навигации. Для этого в классе Frame определено два метода:

  • GetNavigationState(): возвращает состояние навигации фрейма

  • SetNavigationState(string state): восстанавливает состояние навигации, получая состояние в виде сериализованных в строку данных

Для применения этих методов изменим класс приложения:

using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using Windows.UI.ViewManagement;
using Windows.Storage;

namespace NavigationApp
{
    sealed partial class App : Application
    {
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }
        
        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;
            
            if (rootFrame == null)
            {
                rootFrame = new Frame();

                rootFrame.NavigationFailed += OnNavigationFailed;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    if (ApplicationData.Current.LocalSettings.Values.ContainsKey("navHistory"))
                        rootFrame.SetNavigationState(ApplicationData.Current.LocalSettings.Values["navHistory"].ToString());
                }
                
                Window.Current.Content = rootFrame;
            }

            if (rootFrame.Content == null)
            {
                rootFrame.Navigate(typeof(MainPage), e.Arguments);
            }
            
            Window.Current.Activate();
        }

        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
        }
        
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();

            Frame rootFrame = Window.Current.Content as Frame;
            ApplicationData.Current.LocalSettings.Values["navHistory"] = rootFrame.GetNavigationState();

            deferral.Complete();
        }
    }
}

Так как перед переходом в состояние Terminated приложение сначала приостанавливается и переходит в состояние Suspended, то этот переход мы можем обработать, сохранив историю навигации. В данном случае в словарь ApplicationData.Current.LocalSettings.Values, который представляет сохраняемую информацию, добавляется элемент с ключом "navHistory". По этому ключу и будет храниться история навигации:

private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();

    Frame rootFrame = Window.Current.Content as Frame;
    ApplicationData.Current.LocalSettings.Values["navHistory"] = rootFrame.GetNavigationState();

    deferral.Complete();
}

При запуске приложения в методе OnLaunched() проверяется предыдущее состояние приложения. Если оно равно Terminated, то история навигации восстанавливается:

if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
    if (ApplicationData.Current.LocalSettings.Values.ContainsKey("navHistory"))
        rootFrame.SetNavigationState(ApplicationData.Current.LocalSettings.Values["navHistory"].ToString());
}

Чтобы проверить работоспособность определенного нами функционала, мы можем эмулировать завершение приложения в Visual Studio после запуска с помощью опции Suspend and shutdown, которая становится доступной после запуска проекта в режиме отладки:

Suspend and shutdown в UWP

То есть после запуска проекта переходим на какую-нибудь страницу и далее выбираем опцию Suspend and shutdown для эмуляции состояния Terminated. После выбора этой опции приложение должно прекратить свою работу. Затем повторно запускаем проект, и приложение восстанавливает историю навигации. И даже если мы находились на второй или третьей странице, то при повторном запуске приложения мы также окажемся на этой странице.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850