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, эти методы сработают, как и ожидалось.:)

Другие вопросы по тегам