SuspensionManager в Windows Universal Apps ничего не делает для быстрого переключения приложений
У меня возникают проблемы с пониманием того, как я могу выполнить код при быстром переключении приложений (то есть, нажимая кнопку Windows / Пуск, чтобы отобразить экран "Пуск" в эмуляторе телефона, а затем нажимая кнопку "Назад", чтобы вернуться в приложение).
Чтобы упростить проблему, я запустил новое универсальное приложение Windows, которое использует шаблон "Приложение Visual C# Hub (Universal Apps)" в качестве базового кода (поскольку он включает SuspensionManager и NavigationHelper). Так как сам концентратор меня не интересует, я удалил все содержимое Grid из HubPage.xaml и просто добавил TextBox с именем TimeTextBox:
...
<Grid x:Name="LayoutRoot">
<TextBox Name="TimeTextBox"/>
</Grid>
</Page>
Затем в HubPage.xaml.cs я добавил следующую простую строку в метод NavigationHelper_LoadState:
private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
var sampleDataGroups = await SampleDataSource.GetGroupsAsync();
this.DefaultViewModel["Groups"] = sampleDataGroups;
TimeTextBox.Text = DateTime.Now.TimeOfDay.ToString();
}
Если я выполню приложение на эмуляторе телефона после применения этих простых изменений, приложение покажет время суток при загрузке страницы, например: 16:08:53.4390827.
Я хочу, чтобы это время обновлялось каждый раз, когда я перехожу на эту страницу. Но я использую события жизненного цикла из Visual Studio для имитации Suspend, когда я отправляю событие Resume, время остается тем же: 16:08:53.4390827, и точка останова в этой строке подтверждает, что метод NavigationHelper_LoadState не получает выполняется при возобновлении.
Это объясняется тем, что файл App.xaml.cs, как и в шаблоне, не предоставляет прослушивателя для события Resume, поэтому ничего не выполняется. Добавление следующих нескольких строк исправляет это:
public App()
{
this.InitializeComponent();
this.Suspending += this.OnSuspending;
this.Resuming += App_Resuming;
}
async void App_Resuming(object sender, object e)
{
await SuspensionManager.RestoreAsync();
}
Так что, если я снова запустите приложение на эмуляторе телефона, теперь я получу реальное время после возобновления работы. Большой! Проблема в том, что эти события приостановки / возобновления не запускаются, когда я просто нажимаю на кнопку Windows на телефоне, а затем нажимаю на кнопку назад.
На самом деле, я не смог определить ни одного метода, который выполняется при выполнении такого быстрого переключения приложений. И это тот сценарий, который мне действительно интересен для моего универсального приложения.
Есть ли способ поймать, когда навигация возвращает нас в приложение с экрана "Пуск" через кнопку "Назад"? Я пропускаю какой-либо код для обработки этого сценария?
Спасибо!
1 ответ
Здесь нет ничего плохого. Это поведение по умолчанию. Когда вы отлаживаете приложение Windows Phone 8.1 из Visual Studio, единственный способ вызвать событие Suspend/Resume - это использовать события жизненного цикла в VS. Но когда вы запускаете приложение без VS, эти методы сработают, как и ожидалось.:)