@Tyler,Cyberherbalist:我很遺憾,我不能只是在那裏爲你的討論添加評論。我對聲望或其他方面的評價過低。我沒有任何博客發佈它,並給你一個鏈接。我只是寫在這裏,因爲我認爲這是值得注意和寫作的地方,所以其他人也可以從中檢查/使用/表達利益。
..所以,請原諒我這個「offtopic文章」在這裏:)
雖然我不知道如何很好地解決這個問題 - 我的解決方案通常是收集通過手工導航歷史堆棧,把它變成iso,並在激活時恢復並跳到右側/最後一個地方 - 我可以告訴你一些關於墓碑的信息。
的事情是,如果你的應用是停用,但這並不意味着它墓碑。取消激活只是意味着你的應用程序被換出了屏幕。在芒果版本中,您可以點擊&按住「返回」設備按鈕,查看當前打開了哪些應用程序,然後跳轉到任何應用程序。 「激活」是當你的應用程序被喚醒時。即使在WP7 SDK +模擬器的早期版本中,我也從我的應用程序中調用了外部媒體播放器,而且我的應用程序幾乎從未被實際中斷。取消激活/激活總是恢復我的應用程序就在那裏'停止'。所有內存中的對象都未改動。
當設備資源不足時會發生邏輯異常,並且必須「終止」某些後臺任務以釋放內存。我相信當設備的屏幕保護程序下降並且設備長時間處於待機狀態時也可能會發生這種情況。墓碑將逐字殺死您的應用程序,所有內存中的對象將被銷燬/刪除等。唯一能夠倖存的是AppSettings和ISO商店。墓碑保證發生只有如果您的申請是在停用狀態。
那麼,你可以看到什麼樣的生命週期?
1) 「凍結/待機/無焦點」:
- 啓動
- ...(工作)
- 停用(移動到背景)
- ...(保存在內存中,也許進程/線程被凍結,但我懷疑)
- (...)
- 激活(移動到前臺,沒有導航時)
- ...(工作)
- 關閉
2) 「墓碑」:
- 啓動
- ...(工作)
- 停用(移動到背景)
- ...(保存在內存中,也許進程/線程被凍結,但我懷疑)
- ...(墓碑,從中刪除內存,一切都毀)
- (...)
- ...(潔淨應用對象構造)
- 激活(移動到前臺)
- 導航中(我想,總是第一,默認頁面設置在清單中,但我不能肯定現在)
- (工作)
- 關閉
這意味着,墓碑可能是有點防不勝防,同時也意味着,你總是甲肝一段時間來嘗試在停用事件處理程序中使您的狀態保持一致。
這也意味着,(除非有一些通知服務,我還不知道),唯一的方法來檢測是否從墓碑恢復是依靠...是依靠最致命/不愉快的影響:清除你的記憶。
想象一下最簡單的情況:你的App對象有一個屬性「private bool _tomb_test」。它可以是任何類型的任何屬性/字段。你也可以使用你的「object ViewModel {get; set}」。
要記住的第一件事是,不設置它在構造函數中,並做不分配直列默認值。只是讓它漂浮。編譯器/運行時會將應用程序對象創建爲新的時將其設置爲默認值false。這就是要點!
現在:
- 在推出(不構造函數!!!),設置 「_tomb_test =真」 在停用
- ,您的最低持續性狀態保存到ISO
- 在激活後,請檢查:
- if _tomb_test == false表示您是墓碑式的。你的記憶是乾淨的,所有的物體都被毀壞了。根據最後寫入ISO的數據恢復你的狀態,然後開始所有的工作來重新填充/重新下載/重新加載/重新計算/等應用程序狀態的所有其他部分
- 但是,如果_tomb_test == true,那意味着墓碑沒有發生。你的記憶力未變。也許只是GC踢了進來並收集了死者。所有活着的物體都還活着。該應用程序可以免費運行,就像沒有任何事情發生過一樣。
雖然它可能看起來很好,請原諒我這個漫長免責聲明:
我在用100%的成功當前應用程序已成功使用它,但我不能說這是保證平臺的行爲。我還沒有時間在MSDN上挖掘事實。以上所有內容都來自我對7.0和7.1 SDK版本的觀察。
上述方法的一個小問題是它在上依賴於(未經證實的)假設,即內存清除以全有或全無方式工作。
也就是說,假設要麼清除所有對象,要麼不清除(當前事實:應用程序對象並且被觀察爲從頭開始重新創建,甚至初始導航發生以重新創建UI。案件都沒有發生)。
對於假設是錯的......我無法想象誰和爲什麼會決定在.net世界中實現部分內存清除。全面清除意味着殺死應用程序。部分清除意味着摧毀GC世代中的隨機生物,並讓所有其他生物隨着搖晃的手柄或無柄手柄而活着。我無法想象它。我沒有觀察到它。因此,我認爲它是全有或全無。
順便說一句。如果您觀察到部分清除並找到一種大致確定的方式來引起它,那麼其他人也可能會看到它,請大聲播放! :)
只是一個簡短的說明,但也許這可以幫助嗎?我還沒有嘗試過,但它看起來很有希望。 http://tombstonehelper.codeplex.com/ – 2011-05-24 14:12:26