?WP7程序的生命周期如下圖所示:

休眠狀態和墓碑狀態這兩個狀態會比較容易讓人混淆的,休眠狀態時,程序停止運行,但不同的是此時整個進程還是存在于內存中。當恢復這個程序時,就不需要創建一個新的實例。這樣就加快了程序恢復和切換的速度,并且從休眠狀態恢復時我們不需要去恢復墓碑數據。一般情況下點擊home鍵,程序會進入休眠狀態,當前臺程序在運行過程中,內存不足或者不足以讓程序流暢運行時,系統會執行一些操作來釋放內存,此時程序就可能從休眠狀態變換為的墓碑狀態。一個程序進入到墓碑狀態時,其進程被終止掉,但是程序的回退棧中的信息,以及我們保存的一些信息會保留在內存中。
程序恢復時會觸發Application類中的Activated 事件,我們可以通過檢查IsApplicationInstancePreserved參數來判斷程序是從休眠狀態還是墓碑狀態返回的,在此方法中我們可以用來恢復之前在Deactivated事件中保存的數據。
處理的代碼如下:
~~~
private void Application_Activated(object sender, ActivatedEventArgs e)
{
if (e.IsApplicationInstancePreserved)
{
//從休眠狀態恢復
}
else
{
//從墓碑狀態恢復
//這時候程序在內存中的信息已經被清除掉了,需要在這里處理如何恢復你之前的數據
}
}
~~~
?
調試程序墓碑狀態的恢復可以通過在vs上設置來實現這一種模擬的效果,設置如下:

?
????? 從休眠狀態恢復到程序的時候,如果這時候我們在程序中正在發送http請求的話,有可能這個請求會被取消掉,這時候我們需要在程序中來捕獲這個異常并進行處理。處理代碼如下:
?
~~~
private void GetSomeResponse(IAsyncResult MyResultAsync)
{
HttpWebRequest request = (HttpWebRequest)MyResultAsync.AsyncState;
try
{
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(MyResultAsync);
if (response.StatusCode == HttpStatusCode.OK && response.ContentLength > 0)
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
//……
}
}
}
catch (WebException e)
{
if(e.Status == WebExceptionStatus.RequestCanceled)
//這里有可能就是從休眠和墓碑狀態返回來的
//可以在這這里處理休眠和墓碑狀態的恢復,例如重新發送http請求……
else
{
//其他的異常
using (HttpWebResponse response = (HttpWebResponse)e.Response)
{
MessageBox.Show(response.StatusCode.ToString());
}
}
}
}
~~~
?
?
轉載自:[http://www.cnblogs.com/linzheng/archive/2012/01/17/2324991.html](http://www.cnblogs.com/linzheng/archive/2012/01/17/2324991.html)
- 前言
- WindowsPhone之我見
- 整理Windows Phone 7教程(很全面)
- WindowsPhone XAML語法詳解
- WindowsPhone控件詳解及引用外部控件Silverlight Toolkit
- Silverlight for Windows Phone Toolkit升級說明
- WindowsPhone統計圖表控件 - 第三方控件visifire
- WindowsPhone第三方控件-Resco MobileForms Toolkit 2012
- Windows Phone 7 處理休眠和墓碑的恢復
- WindowsPhone自定義控件詳解(一) - 控件類庫分析
- WindowsPhone自定義控件詳解(二) - 模板類庫分析
- WindowsPhone自定義控件詳解(三) - 實戰:自定義帶水印的PasswordBox控件,WatermarkedPasswordBox
- WindowsPhone下拉刷新控件 - PullRefreshListBox(一)