天天看點

Windows Phone 7 處理休眠和墓碑的恢複

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());    

         }    

本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1078449