﻿# WP7 修練 DAY 05：釐清 WP7 閒置偵測機制的疑問

不管開發何種類型的應用程式，其執行生命週期永遠都是最需要先瞭解的，當然撰寫 Windows Phone 7 應用程式也不例外，不瞭解這些生命週期就會經常遇到鬼打牆的情況，在此我**極力推薦** [邊做邊學 Windows Phone 7 開發](http://msdn.microsoft.com/zh-tw/windowsphone/ff955788) 系列文章的 [Silverlight for windows phone 7 Application life cycle & Navigation](http://msdn.microsoft.com/zh-tw/windowsphone/gg546046.aspx) 這篇優質文章 (含影片講解)，請先看過一遍後，再來繼續閱讀本篇修練文章，因為本次修練文章的主旨在於補充說明 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](http://msdn.microsoft.com/en-us/library/ff817008\(v=VS.92\).aspx) )

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/04be8c199ded13afef47-image_1222.png)

首先，我先來講解 **應用程式閒置偵測模式** (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](http://msdn.microsoft.com/en-us/library/ff941090\(v=VS.92\).aspx) 文章裡 **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](http://msdn.microsoft.com/en-us/library/ff941090\(v=VS.92\).aspx)) 裡有特別提到一個重要備註，那就是應用程式若是以 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](http://msdn.microsoft.com/zh-tw/windowsphone/gg546046.aspx) 這篇文章，要認真看完，他會讓你對 WP7 應用程式的生命週期與頁面巡覽有個很清楚的觀念，當然能把 [邊做邊學 Windows Phone 7 開發](http://msdn.microsoft.com/zh-tw/windowsphone/ff955788) 系列文章的相關文章看完也是挺有幫助的。

**相關連結**

-   [Silverlight for windows phone 7 Application life cycle & Navigation](http://msdn.microsoft.com/zh-tw/windowsphone/gg546046.aspx) (中文文章 / 附帶中文影片講解)
-   !! Windows Phone Silverlight Application Life Cycle for Application Launch, Activate, and Deactivate Events ( docx 文件 )
-   [Execution Model Overview for Windows Phone](http://msdn.microsoft.com/en-us/library/ff817008\(v=VS.92\).aspx)
-   [Execution Model Best Practices for Windows Phone](http://msdn.microsoft.com/en-us/library/ff817009\(v=VS.92\).aspx)
-   [How to: Preserve and Restore Page State for Windows Phone](http://msdn.microsoft.com/en-us/library/ff967548\(v=VS.92\).aspx)
-   [How to: Preserve and Restore Application State for Windows Phone](http://msdn.microsoft.com/en-us/library/ff967547\(v=VS.92\).aspx)
-   [Idle Detection for Windows Phone](http://msdn.microsoft.com/en-us/library/ff941090\(v=VS.92\).aspx)
-   [Turn-by-turn navigation - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Turn-by-turn_navigation)
-   [Understanding the Windows Phone Application Execution Model, Tombstoning, Launcher and more… – Part 3.](http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/07/20/understanding-the-windows-phone-application-execution-model-tombstoning-launcher-and-more-part-3.aspx)
-   [Chris Craft's Blog - WP7 Dev Tip #011 The WP7 Lifecycle](http://www.cjcraft.com/blog/2011/01/26/WP7DevTip011TheWP7Lifecycle.aspx)
-   [Windows Phone 7 – Application Lifecycle – Ocean for the Phone « Karl On WPF – .Net](https://web.archive.org/web/20150620103659/https://karlshifflett.wordpress.com/2010/10/17/windows-phone-7-application-lifecycle-ocean-for-the-phone/)
-   [WP7 Application Lifecycle and Tombstoning  WindowsPhoneGeek](http://www.windowsphonegeek.com/articles/WP7-Application-Lifecycle-and-Tombstoning)
