Windows Phone 7 開發 31 日談——第14日:墓碑機制(多工)

l_serein發表於2012-11-04

By Jeff Blankenburg

本文是Windows Phone 7 開發 31 日談” 系列的第14日。

    昨天,我們討論了使用位置資料為使用者提供一種更加熟悉的感覺。今天,我寫的內容可能是Windows Phone 7上面最有爭議的話題:多工。

   現在有大量的文章都寫Windows Phone 7會很糾結,在列表中第一位的就是“缺少多工”。

Windows Phone 7 確實有多工

    是的,這是我說的。這麼說因為這是真的。一個Windows Phone絕對是一個多工的裝置。我可以在聽音樂的同時玩遊戲,或者在上網的時候收郵件。錯誤的訊息是我們應用程式的開發人員傳出的,在開發我們發現不能構建在後臺執行的程式。

在我為Windows Phone 7工作的幾個月中,我只能提出2個真正有說服力的在我的電話中執行後臺應用程式的原因。

  1. 播放音樂的程式。如Pandora程式。我完全認同它在後臺中執行。如果音樂停止了使用者一定會發現的。
  2. 需要從裝置感測器中獲取資料的程式,如GPS,如果程式沒有執行,我就無法告訴你已經走完了你想走的4英里路程。

    在這兩種情況之外,我並沒有覺得有哪些情況是必須要讓程式能在後臺執行的。(如果你的程式在上述任何一類中,你可以向“當權者”呼籲要訪問一個能使程式在後臺執行的“超級API”。但我還是要提醒你……為獲取訪問權準備一個非常充分的理由。)

    你可能會問“但是我如何從我的Web Service中獲得更新呢?難道我不用執行就能獲取嗎?”我的答案是NO,你不能這麼做。有一個叫做推送通知服務的強大機制可以以一種優雅的方式解決這個問題,這個我會在第19日中講解。

    對於剩下的程式,有一個叫做“墓碑”的機制允許我們讓程式看起來總是在執行,即使程式已經被結束。下圖演示了它是如何工作的:

clip_image002

正如你在上圖中看到的,當使用者進入或退出程式時我們可以利用停用和重新啟用事件。通過這些事件,我們可以讓使用者覺得程式從來沒有停止過執行。當我們加入獨立儲存(第15日)和推送通知(第19日)時,這將會變為一個非常給力的故事。

模擬多工

在你的App.xaml.cs檔案中有四個內建的方法(想了解專案檔案結構的更多資訊,請參見第1日 )。來看一下帶有內建註釋的預設狀態。

[c-sharp] view plaincopy
  1. // Code to execute when the application is launching (eg, from Start)  
  2.         // This code will not execute when the application is reactivated  
  3.         private void Application_Launching(object sender, LaunchingEventArgs e)  
  4.         {  
  5.         }  
  6.         // Code to execute when the application is activated (brought to foreground)  
  7.         // This code will not execute when the application is first launched  
  8.         private void Application_Activated(object sender, ActivatedEventArgs e)  
  9.         {  
  10.         }  
  11.         // Code to execute when the application is deactivated (sent to background)  
  12.         // This code will not execute when the application is closing  
  13.         private void Application_Deactivated(object sender, DeactivatedEventArgs e)  
  14.         {  
  15.         }  
  16.         // Code to execute when the application is closing (eg, user hit Back)  
  17.         // This code will not execute when the application is deactivated  
  18.         private void Application_Closing(object sender, ClosingEventArgs e)  
  19.         {  
  20.         }  

“Launching”和“Closing”方法在通常情況下使用:通過通常方法啟動和退出應用程式(例如用返回鍵退出,或者從程式列表中啟動)。Activated和Deactivated方法用於非常規方式的進入和退出。例如,使用返回鍵回到我們的應用程式。或者由於接電話而離開程式。這些都是非常規的。我建議大量測試這些情況,但有一些規則可以遵循。

你應該在使用者退出程式時使用這些方法來儲存狀態資訊,並且在他們返回時更新這些狀態,這樣就產生了他們從未退出的錯覺。這麼做的原因很簡單:

  1. 大多數使用者都不會意識到在他們離開程式後,程式仍然在後臺消耗著系統資源和電池電量(如果你正在閱讀本文,就你不屬於大多數使用者了)。
  2. 大多數應用程式都沒有在後臺執行的必要。這是節省系統資源的好方法。

在程式被停用時儲存你的狀態

在使用者退出時要做的第一件事就是儲存它們的資訊。在我的例子中,我構建了一個看似一直在執行的計時器,即使當它沒有執行時。如果你想看全部程式碼,翻到文章底部,見“下載程式碼示例”一節。我只在這裡展示和墓碑相關的部分程式碼,但文章底部的程式碼是完整可用的應用程式。

為了儲存資料,我使用PhoneApplicationService類。我會在明天(第15日)講獨立儲存,一種更持久的儲存資料的方法。在我的例子中,我想知道你何時退出了程式,所以我要計算你退出時和下次執行程式時兩者之間的差值。

[c-sharp] view plaincopy
  1. private void Application_Deactivated(object sender, DeactivatedEventArgs e)  
  2. {  
  3. PhoneApplicationService.Current.State["LeftTime"] = DateTime.Now;  
  4. }  

在我的應用程式中,當載入頁面時還有一個OnNavigatedTo事件。如果“LiftTime”的值存在,我就使用它,否則我假設你是第一次啟動程式。

在程式被重新啟用時恢復你的狀態

在這個例子中,我恢復了在退出時儲存下來的值。

[c-sharp] view plaincopy
  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)  
  2. {  
  3.     base.OnNavigatedTo(e);  
  4.     if (PhoneApplicationService.Current.State.ContainsKey("LeftTime"))  
  5.     {  
  6.         DateTime deactivated = (DateTime)PhoneApplicationService.Current.State["LeftTime"];  
  7.         secondsSinceStart = (int)(DateTime.Now - deactivated).TotalSeconds + (int)PhoneApplicationService.Current.State["ElapsedTime"];  
  8.         writeTime();  
  9.         writeDate();  
  10.         timer.Start();  
  11.     }  
  12.     else secondsSinceStart = 0;  
  13. }  

通過這種方法,我能保持一個連續的計時器,甚至是當我們離開程式時。如果你去問任何使用者,他們都會告訴你程式一直在執行。他們唯一能看到的現象是在程式載入較慢時出現的“Resuming”螢幕。實際上我不得不強制程式暫停才捕獲到下面的截圖:

clip_image003

以上是墓碑機制背後的基礎知識。在退出時儲存狀態,並在回去時恢復。你的使用者絕不會知道這其中的差別,同時你還可以為他們提供更好的續航時間,效能和使用者體驗。

下載程式碼示例

相對於上面所述程式碼的一個較複雜的例子,我的計時器一直在執行(即使在後臺)。按下模擬器的開始按鍵退出,用返回鍵回到程式中。程式中還有一個文字框供你鍵入資訊,它會在你退出時被儲存。

clip_image005

原文地址:http://www.jeffblankenburg.com/post/31-Days-of-Windows-Phone-7c-Day-14-Tombstoning-%28Multi-tasking%29.aspx

相關文章