WP7 восстановиться с Tombstone и вернуться на страницу - PullRequest
3 голосов
/ 24 мая 2011

Есть ли хороший / элегантный способ вернуться на страницу, на которой был пользователь, когда восстанавливался после надгробия? Я не уверен, работает ли мое приложение или просто так, но я всегда возвращаюсь на главную страницу.

Мое приложение настроено с главной страницей, которая имеет элемент управления Pivot, и несколько элементов Pivot будут перемещаться на новые страницы. Мой Naigation выглядит примерно так, если имеет смысл:

PivotItem1 -> PageA
PivotItem2 -> PageB -> PageC
PivotItem3 -> PageD -> PageE - PageF (Нажатие кнопки «Назад» на PageF приведет к использованию нелинейного навигационного сервиса на главной странице)

Так что, если надгробия пользователя на любой из страниц, я хочу вернуть их на эту страницу и иметь доступный BackStack, чтобы навигация не была испорчена.

Я использую MVVM Light и NonLinear Navigation Service, если это помогает или мешает тому, что я пытаюсь достичь.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

@ Тайлер, Cyberherbalist: Я сожалею, что не могу просто «добавить комментарий» к вашей дискуссии прямо там.У меня пока слишком мало репутации или чего-то еще.У меня нет ни одного блога, чтобы разместить его там и дать вам ссылку на него.Я просто напишу здесь, потому что я думаю, что это стоит заметить и написать где-нибудь, поэтому другие могут также проверить / использовать / permormanceprofit от этого.

.. так, извините меня за эту "оффтопическую статью" здесь:)

Хотя я не знаю, как правильно решить проблему - обычно я решаю собрать стек истории навигации вручную, поместить его в iso, восстановить при активации и перейти на нужное / последнее место- Я могу немного рассказать вам о надгробии.

Дело в том, что если ваше приложение деактивировано , то не означает, что оно захоронено.Деактивация просто означает, что ваше приложение выгружено с экрана.В выпуске Mango вы можете нажать и удерживать кнопку «Назад» на устройстве, посмотреть, какие приложения открыты в данный момент, и перейти к любому.«Активируется» - это когда ваше приложение просыпается.Даже в самых ранних выпусках эмулятора WP7 SDK + я вызывал внешний медиаплеер из своих приложений, и мои приложения почти никогда не были физически убиты.Деактивированный / Активированный всегда возобновлял мое приложение как раз там, где оно было «остановлено».Все объекты в памяти остались нетронутыми.

Надгробия происходят, когда на устройстве мало ресурсов, и они должны «убивать» некоторые фоновые задачи, чтобы освободить память.Я полагаю, что это может также произойти, когда заставка устройства выпадает из строя, и устройство находится в режиме ожидания в течение длительного времени.Tombstoning буквально убьет ваше приложение, все объекты в памяти будут уничтожены / удалены и так далее.Единственное, что выживет, это AppSettings и магазин ISO.Гарантированное захоронение может произойти * ТОЛЬКО 1013 * , если ваше приложение находится в состоянии деактивировано .

Итак, какие жизненные циклы вы видите?

1)«Стоп / Ожидание / Нефокусировка»:

  • Запуск
  • ... (работает)
  • Деактивирован (перемещен в фоновый режим)
  • ... (хранится в памяти, возможно процесс / поток заморожен, но я сомневаюсь)
  • (...)
  • Активирован (перемещен на передний план, навигация не происходит)
  • ... (работает)
  • Закрытие

2) "Tombstoned":

  • Запуск
  • ... (работает)
  • Деактивировано (перемещено в фоновый режим)
  • ... (хранится в памяти, возможно, процесс / поток заморожен, но я сомневаюсь)
  • ... (захоронено, удаленоиз памяти все уничтожено)
  • (...)
  • ... (чистый объект приложения построен)
  • Активирован (перемещен на передний план)
  • Навигация (я думаю, всегда на первой странице по умолчанию, установленной в манифесте, ноСейчас я не уверен)
  • (работает)
  • Закрытие

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

Это также означает, что (если не существует какой-либо службы уведомлений, о которой я пока не знаю), единственный способ обнаружить, если«Возобновление из надгробной плиты» - это полагаться на… это полагаться на самый смертельный / неприятный эффект: очищение вашей памяти.

Представьте простейший случай: у вашего объекта App есть свойство »приватный бул _tomb_test ".Это может быть ЛЮБОЕ свойство / поле ЛЮБОГО типа.Для этого вы также можете использовать свой "объект ViewModel {get; set}".

Первое, что нужно запомнить, это NOT , чтобы установить его в конструкторе, и сделать NOT назначить встроенное значение по умолчанию.Просто оставь это плавающим.Компилятор / среда выполнения установит для него значение по умолчанию false всякий раз, когда объект App создается заново новым.И в этом суть!

сейчас:

  • в Launched (не ctor !!!), установите "_tomb_test = true"
  • в деактивированный, сохраните ваш минимумпостоянное состояние по ISO
  • в активированном, проверьте:
    • если _tomb_test == false, это означает, что вы были захоронены.ваша память чиста, все объекты были уничтожены.восстановите свое состояние в соответствии с данными, которые были в последний раз записаны в ISO, а затем запустите все задания, чтобы пополнить / заново загрузить / перезагрузить / пересчитать / и т.д. все остальные части состояния приложения
    • , но, если _tomb_test == true, этоозначает, что захоронение не произошло.Ваша память не тронута.может быть, просто GC пнул и собрал мертвых.все объекты, которые были живы, все еще живы.Приложение можно просто запустить, как будто ничего не произошло.

Хотя это может выглядеть красиво, извините меня за этот длинный отказ от ответственности:

Я успешно использую его в текущем приложении со 100% успехом, но не могу сказать, что это гарантированное поведение платформы.Я еще не нашел время, чтобы копаться в фактах на MSDN.Все вышеперечисленное исходит из моих наблюдений за выпусками SDK 7.0 и 7.1.

Небольшая проблема вышеуказанного подхода заключается в том, что он опирается на (недоказанное?) Предположение, что памятьочистка работает по принципу «все или ничего».

То есть предполагает, что либо все объекты очищены, либо очистка не происходит (текущий факт: объект App и наблюдается его воссоздание с нуля,и даже первоначальная навигация происходит для воссоздания пользовательского интерфейса. В других случаях этого не происходит).

Из-за неверного предположения ... Я просто не могу представить, кто и почему когда-нибудь решит осуществить частичную очистку памятив мире .net.Полная очистка означает уничтожение приложения.Частичная чистка означает уничтожение случайных живых объектов в поколениях GC и оставление всех остальных живыми с помощью висящих ручек или ручек с нулевыми элементами.Я не могу себе это представить.Я этого не заметил.Таким образом, я предполагаю, что это все или ничего.

Кстати.Если вы когда-либо наблюдаете частичную очистку и находите в основном детерминистический способ ее вызвать, чтобы другие тоже могли ее увидеть, пожалуйста, передайте ее громко!:)

0 голосов
/ 24 мая 2011

У меня есть похожее навигационное приложение, и оно делает то, что вы хотите (также использует NonLinear Navigation Service). В моем случае я сохраняю текущий элемент страницы / сводки пользователя в изолированном хранилище вместе с токеном (или bool), указывающим, возвращается ли приложение из захоронения. Когда пользователь переходит на страницу, загрузка страницы устанавливает текущее значение страницы в iso, а если страница имеет сводку, она также устанавливает текущую сводку на первую. Событие pivot_changed содержит код для изменения нового текущего сводного уровня на тот, на который пользователь только что изменил.

Когда приложение находится в процессе захоронения, происходит событие app_deactivate, и именно здесь я устанавливаю значение IsTombstoned в iso равным true.

Когда пользователь возвращается из tombstoning, главная page_load сначала проверяет, восстанавливается ли приложение после того, чтобы быть захороненным (IsTombstoned = true), и, если это так, оно сразу переходит на страницу, имя которой было сохранено в iso. Когда запускается текущая текущая page_load, он проверяет, является ли IsTombstoned = true, и если да, устанавливает его в значение false (обратно в нормальное состояние), и, если на странице есть сводка, устанавливает выбранный элемент сводки в сохраненный текущий свод. Если страница не имеет элемента управления сводкой, текущий свод остается пустым. Если на странице был динамический контент, когда он был захоронен, вам также потребуется обеспечить его восстановление.

Извините, я не показываю вам код, но я далеко от рабочей станции и не могу добраться до него.

...