Windows Phone 7處理休眠和墓碑的恢復
休眠狀態和墓碑狀態這兩個狀態會比較容易讓人混淆的,休眠狀態時,程序停止運行,但不同的是此時整個進程還是存在于內存中。當恢復這個程序時,就不需要創建一個新的實例。這樣就加快了程序恢復和切換的速度,并且從休眠狀態恢復時我們不需要去恢復墓碑數據。一般情況下點擊home鍵,程序會進入休眠狀態,當前臺程序在運行過程中,內存不足或者不足以讓程序流暢運行時,系統會執行一些操作來釋放內存,此時程序就可能從休眠狀態變換為的墓碑狀態。一個程序進入到墓碑狀態時,其進程被終止掉,但是程序的回退棧中的信息,以及我們保存的一些信息會保留在內存中。
WP7程序的生命周期如下圖所示:
程序恢復時會觸發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
【編輯推薦】