Windows Phone 7處理休眠和墓碑的恢復(fù)
休眠狀態(tài)和墓碑狀態(tài)這兩個(gè)狀態(tài)會(huì)比較容易讓人混淆的,休眠狀態(tài)時(shí),程序停止運(yùn)行,但不同的是此時(shí)整個(gè)進(jìn)程還是存在于內(nèi)存中。當(dāng)恢復(fù)這個(gè)程序時(shí),就不需要?jiǎng)?chuàng)建一個(gè)新的實(shí)例。這樣就加快了程序恢復(fù)和切換的速度,并且從休眠狀態(tài)恢復(fù)時(shí)我們不需要去恢復(fù)墓碑?dāng)?shù)據(jù)。一般情況下點(diǎn)擊home鍵,程序會(huì)進(jìn)入休眠狀態(tài),當(dāng)前臺(tái)程序在運(yùn)行過程中,內(nèi)存不足或者不足以讓程序流暢運(yùn)行時(shí),系統(tǒng)會(huì)執(zhí)行一些操作來釋放內(nèi)存,此時(shí)程序就可能從休眠狀態(tài)變換為的墓碑狀態(tài)。一個(gè)程序進(jìn)入到墓碑狀態(tài)時(shí),其進(jìn)程被終止掉,但是程序的回退棧中的信息,以及我們保存的一些信息會(huì)保留在內(nèi)存中。
WP7程序的生命周期如下圖所示:
程序恢復(fù)時(shí)會(huì)觸發(fā)Application類中的Activated 事件,我們可以通過檢查IsApplicationInstancePreserved參數(shù)來判斷程序是從休眠狀態(tài)還是墓碑狀態(tài)返回的,在此方法中我們可以用來恢復(fù)之前在Deactivated事件中保存的數(shù)據(jù)。
處理的代碼如下:
- private void Application_Activated(object sender, ActivatedEventArgs e)
- {
- if (e.IsApplicationInstancePreserved)
- {
- //從休眠狀態(tài)恢復(fù)
- }
- else
- {
- //從墓碑狀態(tài)恢復(fù)
- //這時(shí)候程序在內(nèi)存中的信息已經(jīng)被清除掉了,需要在這里處理如何恢復(fù)你之前的數(shù)據(jù)
- }
- }
調(diào)試程序墓碑狀態(tài)的恢復(fù)可以通過在vs上設(shè)置來實(shí)現(xiàn)這一種模擬的效果,設(shè)置如下:
從休眠狀態(tài)恢復(fù)到程序的時(shí)候,如果這時(shí)候我們?cè)诔绦蛑姓诎l(fā)送http請(qǐng)求的話,有可能這個(gè)請(qǐng)求會(huì)被取消掉,這時(shí)候我們需要在程序中來捕獲這個(gè)異常并進(jìn)行處理。處理代碼如下:
- 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)
- //這里有可能就是從休眠和墓碑狀態(tài)返回來的
- //可以在這這里處理休眠和墓碑狀態(tài)的恢復(fù),例如重新發(fā)送http請(qǐng)求……
- else
- {
- //其他的異常
- using (HttpWebResponse response = (HttpWebResponse)e.Response)
- {
- MessageBox.Show(response.StatusCode.ToString());
- }
- }
- }
- }
原文鏈接:http://www.cnblogs.com/linzheng/archive/2012/01/17/2324991.html
【編輯推薦】