Статьи

Управление жизненным циклом процессов (PLM) и управление состоянием в приложениях Windows 8 Metro C #

В традиционной среде Windows пользователь управляет временем жизни своих приложений. Пользователь запускает приложение и продолжает работать до тех пор, пока пользователь не решит закрыть его. Проблема этой модели заключается в том, что приложения продолжают истощать системные ресурсы, включая память и ЦП, даже если они не находятся на переднем плане. Это влияет на производительность приложения, которое использует пользователь, а также быстрее разряжает батарею, когда устройство не подключено.

Приложения Windows 8 Metro запускаются только тогда, когда они находятся на переднем плане. Это позволяет пользователю сосредоточиться на основном приложении, с которым он хочет взаимодействовать. Приложения в фоновом режиме переходят в приостановленное состояние. В приостановленном состоянии потоки приложения буквально замораживаются на месте. Приложение больше не будет занимать системные ресурсы или влиять на время автономной работы. Большую часть времени приложение будет оставаться в памяти. Это позволяет быстро переключаться между приложениями, поэтому, когда пользователь переходит обратно в другое приложение, оно немедленно возобновляется, как если бы оно уже было запущено.

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

Это очень легко подражать. В Visual Studio 2012 создайте новый проект Windows 8 Metro для C # с помощью шаблона Grid:

Теперь запустите приложение в режиме отладки. Это проще сделать, если у вас есть два монитора, так что вы можете отлаживать с одного монитора и работать с приложением Metro на втором; другие опции включают запуск в симуляторе и удаленную отладку на другое устройство. После запуска приложения перейдите на несколько разных страниц. В Visual Studio 2012 выберите параметр «Приостановка и завершение работы».

Вы только что смоделировали событие завершения. Для многих пользователей это произойдет, если они не знают, когда приложение находится в фоновом режиме. Однако когда пользователь вернется в приложение, он будет ожидать, что он продолжит с того места, где он покинул приложение. Вы можете смоделировать это, снова отладив и запустив приложение. Вы обнаружите, что попали на ту же страницу, которую оставили, и даже история навигации (т. Е. Кнопка «Назад») сохраняется. Как это возможно?

Вот грубая визуализация Process Lifetime Management в приложениях Windows 8 Metro:

Чтобы понять, как вы можете сохранить состояние в вашем приложении, также важно понимать навигацию. Если вы не используете пользовательскую форму навигации, вы используете встроенный класс Frame для управления вашей навигацией. Этот класс предоставляет службы навигации, а также место для размещения целевых страниц по мере их загрузки. В общем, последовательность навигации выглядит примерно так:

Навигационные события важны, потому что они обеспечивают способ подключения к конвейеру и являются логическим способом сохранения состояния. В шаблонах Visual Studio 2012, предоставляемых для приложений Metro, создается немного волшебства в виде двух важных классов. Во-первых, если вы осмотрите страницы своего приложения, вы обнаружите, что они являются производными от класса LayoutAwarePage. На этой странице много работы по дому для вас. Он будет реагировать на изменения ориентации путем обновления визуального состояния страницы и обрабатывать навигацию вместе со вторым важным классом, SuspensionManager.

Если вы откроете исходный код LayoutAwarePage, вы найдете регион для Process Lifetime Management. В этом регионе вы обнаружите, что навигационные события отменены. В этих методах есть код, который управляет состоянием приложения для вас. Это достигается путем создания словаря для каждой страницы, в котором, помимо прочего, сохраняются параметры навигации, которые были переданы на страницу. Если вы хотите использовать эту встроенную систему, единственное правило заключается в том, что все, что вы передаете в качестве параметра навигации, может быть сериализовано. Это позволяет классу SuspensionManager использовать DataContractSerializer для сохранения состояния вашего приложения. Чтобы увидеть, как это работает, снова запустите приложение и перейдите на несколько страниц, а затем завершите его.

Дважды щелкните файл Package.appxmanifest в обозревателе решений и перейдите на вкладку «Упаковка». Прочитайте название пакета:

Теперь перейдите в командную строку и введите:

cd% userprofile% \ appdata \ local \ packages

Это приведет вас в локальную папку, где хранится информация для ваших приложений Windows 8 Metro. Перейдите в каталог, который соответствует имени пакета, которое вы нашли выше. В этой папке вы найдете другую папку с именем LocalState. Эта папка содержит файл с именем _sessionState.xml. Откройте этот файл, и вы найдете сериализованное состояние для вашего приложения.

Принцип работы этого механизма прост. Перед предварительным просмотром выпуска навигация выполнялась аналогично Windows Phone: события навигации получали параметры, и приложение реагировало на эти параметры. С введением встроенного управления состоянием LayoutAwarePage перехватывает навигацию. Вместо использования навигации теперь вы используете методы LoadState и SaveState.

Они подключены для вас в шаблонах. LayoutAwarePage управляет настройкой словаря и сохранением любых параметров, переданных на страницу. При переходе на страницу вызывается метод LoadState. Вот пример, который генерируется шаблоном по умолчанию:

protected override void LoadState(Object navigationParameter, 
    Dictionary<String, Object> pageState)
{
    var group = SampleDataSource.GetGroup((String)navigationParameter);
    this.DefaultViewModel["Group"] = group;
    this.DefaultViewModel["Items"] = group.Items;
}

Обратите внимание, что параметр навигации автоматически восстанавливается и передается. Если ваше приложение использует только параметры навигации, то все происходит автоматически. Ваше приложение будет работать, и пользователи смогут перемещаться глубоко внутри приложения, менять местами и возвращаться без потери истории навигации. Но что, если вы хотите сохранить свои собственные значения за пределами параметров навигации? Это достаточно просто.

В файле GroupedItemsPage.xaml.cs измените заголовок страницы, чтобы он вместо этого содержал дату. Вот код в конструкторе:

public GroupedItemsPage()
{
    this.InitializeComponent();
    pageTitle.Text = DateTime.Now.ToString();
}

Теперь осталось всего два шага, чтобы сохранить дату. Во-первых, LoadState должен проверить сохраненное значение и восстановить его при его наличии. При первом запуске приложения словарь пуст, поэтому убедитесь, что словарь существует, прежде чем проверять значение:

if (pageState != null && pageState.ContainsKey("Date"))
{
    pageTitle.Text = (String)pageState["Date"];
}

Конечно, вам также необходимо сохранить значение. Чтобы сохранить его, просто переопределите метод SaveState. Вам удобно передать словарь, который сохраняется с состоянием страницы, поэтому любую информацию, которую вы хотите сохранить, вы можете просто добавить в этот словарь:

protected override void SaveState(Dictionary<string, object> pageState)
{
    pageState["Date"] = pageTitle.Text;
    base.SaveState(pageState);
}

И это все, что нужно сделать! Теперь вы можете запустить приложение, перейти на несколько разных страниц, приостановить и закрыть его, а затем снова загрузить. Вы найдете, что дата, показанная на главной странице, не изменяется, потому что она сохраняется с помощью встроенных функций управления состоянием. Конечно, если у вас есть более сложные типы, которые не сериализуются напрямую, вам может понадобиться другая стратегия. Я описываю различные методы сохранения и восстановления данных, а также сериализации более сложных типов в своей книге « Разработка приложений Windows 8 Metro с использованием C # и XAML» . Счастливого Windows 8 кодирования!

Джереми Ликнесс