@ Тайлер, 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 и оставление всех остальных живыми с помощью висящих ручек или ручек с нулевыми элементами.Я не могу себе это представить.Я этого не заметил.Таким образом, я предполагаю, что это все или ничего.
Кстати.Если вы когда-либо наблюдаете частичную очистку и находите в основном детерминистический способ ее вызвать, чтобы другие тоже могли ее увидеть, пожалуйста, передайте ее громко!:)