不管開發何種類型的應用程式,其執行生命週期永遠都是最需要先瞭解的,當然撰寫 Windows Phone 7 應用程式也不例外,不瞭解這些生命週期就會經常遇到鬼打牆的情況,在此我極力推薦 邊做邊學 Windows Phone 7 開發 系列文章的 Silverlight for windows phone 7 Application life cycle & Navigation 這篇優質文章 (含影片講解),請先看過一遍後,再來繼續閱讀本篇修練文章,因為本次修練文章的主旨在於補充說明 WP7 閒置偵測機制 (Idle Detection) 的研究心得。
Windows Phone 作業系統對於「省電」這件事看的比什麼都還重要,連手機提供 Wi-Fi 熱點 (Hotspot) 功能都不提供,甚至 WP7 手機透過 USB 連接電腦時也不能分享 3G 網路給電腦用,實在是小氣到家,不過手機可以用的比較久是真的。 ^^
針對 WP7 的閒置偵測機制 (Idle Detection) 主要分成兩大塊:
備註: 在 WP7 應用程式裡預設都是 啟用 (Enabled) 的狀態!
- 應用程式閒置偵測模式 (Application Idle Detection Mode)
- 使用者閒置偵測模式 (User Idle Detection Mode)
這兩種閒置偵測模式我感覺其實是不大一樣的東西,但是從字面上來看卻是類似的東西,所以當我第一次看到這兩個模式時,會覺得有點一頭霧水,也因此特別撰寫這篇修練文章來釐清我的疑慮。
關於 Windows Phone 的執行生命週期,我特別喜歡以下這張流程圖,他說明了一個 Windows Phone OS 7.1 (Mango) 應用程式的各種狀態的變化與事件的執行順序:( 參考自 Execution Model Overview for Windows Phone )
首先,我先來講解 應用程式閒置偵測模式 (Application Idle Detection Mode) 的特性:
在先前的 Windows Phone OS 7.0,當手機螢幕進入鎖定的狀態時,應用程式會進入所謂的 墓碑狀態 (Tombstoned),程式會從記憶體中卸載,所以該應用程式完全不會消耗電池的電力。所以當時很有可能會有人想說不要讓應用程式進入所謂的墓碑狀態以加快當應用程式回到執行狀態時的回復時間,但這樣的缺點可想而知就是會消耗電池電力。
若你設定 停用應用程式閒置偵測模式,意思是說,當手機螢幕進入鎖定的狀態時,讓應用程式還是會繼續執行,也代表著應用程式不會進入墓碑狀態,也意謂著應用程式不會觸發 Application_Deactivated 與 Application_Activated 事件。
以下是停用應用程式閒置偵測模式的語法,而且一定要在 App.xaml.cs 的建構子 App() 方法裡執行:
PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled;
如果你一定要停用應用程式閒置偵測模式的話,請務必參考 Idle Detection for Windows Phone 文章裡 Checklist for Silverlight Applications that Disable Application Idle Detection , Checklist for XNA Framework Games that Disable Application Idle Detection 與 Other Considerations When Disabling Application Idle Detection 這三個段落的檢查清單!
微軟 MSDN 文件 (Idle Detection for Windows Phone) 裡有特別提到一個重要備註,那就是應用程式若是以 Windows Phone OS 7.1 (芒果機) 開發的,千萬不要以停用應用程式閒置偵測模式的方式來加速應用程式從 墓碑狀態 (Tombstoned) 回復 執行狀態 (Running) 的時間,因為並不會比較快!其原因就是 Windows Phone OS 7.1 新增了一個 休眠狀態 (dormant state),所有應用程式在被迫關閉時會先進入休眠狀態,此時應用程式的完整狀態都會自動被保留,只要手機當下的記憶體還足夠時,應用程式都不會進入墓碑狀態,所以從休眠狀態轉變成執行狀態的速度將會非常快,無須設定停用應用程式閒置偵測模式。
補充說明
在你的 Windows Phone 7.5 (Mango) 手機按著 Back 鍵不放,會出現一些曾開過的應用程式畫面縮圖,
那些應用程式就是在「休眠狀態」,如果看不見,那就是進入了「墓碑狀態」了。
所以 應用程式閒置偵測模式 其實跟應用程式的閒置偵測沒啥關係,其實就是判斷手機螢幕是否被鎖定,以及應用程式要不要被關閉而已,從使用者的角度來看,沒有所謂偵測不偵測的問題,這也是我第一次看到這個模式時無法理解的原因。
再來,接著講解 使用者閒置偵測模式 (User Idle Detection Mode) 的特性:
這裡的 使用者閒置偵測模式 就與「使用者」有直接相關,也比較容易理解,講的就是使用者到底有沒有碰到手機的螢幕或硬體按鍵,當應用程式偵測「一段時間」閒置的時候,就會告知 WP7 作業系統可以鎖定螢幕了,而這時就會把應用程式的控制權交給 應用程式閒置偵測模式 來判斷,由這個模式的設定值來決定應用程式是否應該進入休眠模式。
備註:所謂的「一段時間」是定義在手機的系統設定裡,其設定的路徑在:[設定] / [系統] / [鎖定+背景圖案] / [螢幕逾時]。
以下是停用使用者閒置偵測模式的語法,此語法可以在任意時間做設定:
PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
使用者閒置偵測模式 有一點必須特別注意,他所偵測的範圍僅限於 手機的螢幕 與 硬體按鍵 而已,對於設備內建的 Accelerometer (加速度感應器)、Location Service (位置服務)、FM radio (收音機) 等額外的硬體感應配件不會進行判斷!
一般來說,會選擇停用使用者閒置偵測模式的時機點很多,例如你所設計的 App 擁有導航功能需要一直顯示不斷變動的地圖,或是透過加速度感應器來玩遊戲等等,這類的應用程式都需要透過設定停用使用者閒置偵測模式來完成任務。雖然這些都是合裡的使用情境,不過微軟還是建議如果你的感應器有一段時間沒有異動的話,還是要透過程式啟用使用者閒置偵測模式,以免使用者因為忘記開了某個應用程式而導致手機電池耗盡。
今日修練總結
瞭解閒置偵測模式的細節非常重要,這關係著你的應用程式到底省不省電,還有你的 App 到底能不能成功上架到 Windows Marketplace。另外我還是再一次推薦 Silverlight for windows phone 7 Application life cycle & Navigation 這篇文章,要認真看完,他會讓你對 WP7 應用程式的生命週期與頁面巡覽有個很清楚的觀念,當然能把 邊做邊學 Windows Phone 7 開發 系列文章的相關文章看完也是挺有幫助的。
相關連結