2015-03-29 3 views
0

У меня возникли проблемы с управлением жизненным циклом моего приложения, потому что я точно не знаю, какие события и функции относятся к жизненному циклу страницы/приложения, когда. Было бы неплохо, если бы Microsoft все это где-то табулировала. Конкретно, вот что я думаю я знаю и то, что я не знаю, о поведении каждого из следующих событий/функций:Поведение страниц и приложений в Windows Phone 8.1 Время выполнения

Page.Page() (конструктор): Запускается, когда страница создается для первой время. Не уверен, что он запускается только один раз, когда приложение запущено, или каждый раз, когда я перехожу к странице в течение одного сеанса.

Page.OnNavigatedTo(): Выполняется при создании страницы и при каждом ее перемещении.

Page.OnNavigatedFrom(): Выполняется, когда пользователь покидает страницу. Не запускается, когда пользователь нажимает кнопку «Пуск» или кнопку блокировки во время отображения страницы.

App.App() (конструктор): Выполняется только один раз при запуске приложения.

App.Resuming: Восстанавливается, когда приложение отображается в поле зрения после его свертывания/приостановки или когда пользователь открывает экран, и приложение появляется в поле зрения. Не запускается, когда приложение запускается в первый раз.

App.Suspending: Пожар, когда пользователь нажимает кнопку «Назад» на домашней странице (т. Е. Приложение больше не отображается) и при нажатии кнопки запуска.

Все, что я пропустил или ошибся? Причина, по которой я пытаюсь быть уверенным, заключается в том, что у моего приложения есть страница, на которой работает фоновый аудиоплеер, который, в свою очередь, нуждается в тщательно управляемой системе подписки на события/без подписки, и он часто ведет себя неловко, если я нажимаю кнопку «Пуск» на этой странице , И еще одна проблема заключается в том, что у меня есть статический объект в моем приложении App.xaml.cs, который я использую в приложении, и который предоставляет некоторые события. Сейчас я подписавшись/отпиской на события на каждой странице, как так:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    App.globalObject.Event1 += Event1_handler; 
} 

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    App.globalObject.Event1 -= Event1_handler; 
} 

Но я не уверен, если это правильный подход (очевидно, я пытаюсь убедиться, что я только подписался событие один раз, чтобы избежать обработки обработчика событий несколько раз). Должен ли я просто подписаться на событие один раз в конструкторе страницы?

Редактировать: Я использую шаблон проекта с включенными классами SuspensionManager и NavigationHelper, в случае если что-либо изменит.

+0

Конструктор страниц может работать или не запускаться несколько раз, в зависимости от того, как настроен режим кэширования для этой страницы. –

+0

Как обеспечить, чтобы обработчик событий был присоединен только один раз, если у меня есть необходимое кеширование? Я пробовал практически все возможные комбинации, и я все еще получаю дубликаты вложений. – Ali250

+0

Вы всегда можете отказаться от подписки перед подпиской. Что-то вроде: App.globalObject.Event1 - = Event1_handler; App.globalObject.Event1 + = Event1_handler; –

ответ

0

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

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    App.globalObject.Event1 -= Event1_handler; 
    App.globalObject.Event1 += Event1_handler; 
} 
+0

Не избавляет ли оператор '- =' от одного приложения к событию? Или он избавится от всех экземпляров «Event1_handler», подписанных на мероприятие? – Ali250

+1

Вы правы, он избавится только от 1 обработчика –

Смежные вопросы