2010年12月3日 星期五

Windows Phone 如何在 Screen Locked 環境運行

前幾天在開發中的 Windows Phone 專案上新增了一個功能,
大概就是啟動一個 Thread 定時檢查網路上的資訊,若雲端的檔案被更新就抓下來,

開發時使用 Emulator 一切正常,發佈至手機上時竟出現新問題,
該 Thread 在裝置進入 Idle 關閉螢幕時竟也跟著停了,這在模擬器上還真難發現這個特性,
更慘的是不只 Thread 停了,開啟螢幕時該 App 竟重新啟動,
看來在螢幕關閉時裝置會進到 tombstone 狀態,我的下載動作也跟著停止了,
就在我灰心的以為沒救的時後,隨手 Google 了一下查到這篇文章,

Running a Windows Phone Application under the lock screen

全文的重點就是這三句 :P

Running Under Locked Screen
In short, to let your application run under locked screen,  you must:
1. Set PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled;

其餘就是觀念的說明嘍,因為這實在是太重要了,所以記下來。

PhoneApplicationService 是用來管理 App 的重要類別,
而 PhoneApplicationService.Current 即是用來取得當前這個 App Service
Current 這個成員本身就是一個 PhoneApplicationService 的指標,
而 ApplicationIdleDetectionMode 屬性用來標記此 App 在進入 Idle 時的行為模式,
我們有兩個選擇 IdleDetectionMode.Disabled 或 IdleDetectionMode.Enabled
講白話就是裝置閒置時, ApplicationService 是否主動回收資源,預設是 Enabled 回收,
這個出發點是好的,因為可攜裝置大多的用途是接收資訊,而不是用來發出資訊,
就比如我們不會選擇用手機打一大篇文章,這種事往往會用適合且方便的 PC 來做,
所以背光關閉的情況下 App 理論上不應該繼續更新畫面資訊,這樣單純是在耗費資源,
但若是有必要,我們還是可以利用改變這個屬性為 Disabled 來讓 App 持續運作。

PhoneAppService 下除了 ApplicationIdleDetectionMode 這個屬性之外,
還有另一個很像的屬性,名稱為 UserIdleDetectionMode
雖然這也是和 Idle 相關的重要屬性,但相較之下 AppIdleDetectionMode 必要性就強多了,
UserIdleDectionMode 也有同樣的兩個值可以指定 IdleDetectionMode.Disabled 與 Enabled
預設同樣是 IdleDetectionMode.Enabled ,意指偵測用戶 Idle 狀態,
視裝置用戶在 Settings 中設的背光關閉時間而定,
若裝置閒置到那段時間即會進入 Idle Screen Lock 狀態,
而當 UserIdleDectionMode 設為 IdleDetectionMode.Disabled 時,
裝置將會恆不進入 Screen Lock 狀態,即螢幕背光恆亮,相當耗費資源,
大概要像播放影片這種需求才會考慮將 UserIdleDectionMode 設為 Disabled 吧,

MSDN 對於 IdleDetectionMode 的說明於此:IdleDetectionMode Enumeration

以程式碼說明一下


using Microsoft.Phone.Shell;

// 讓 App 在 Screen Lock 狀態下也可以照常執行

PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled;

// 讓 App 在運行時永遠不偵測 Idle 及進入 Screen Lock ,除非用戶主動 Lock Screen

PhoneApplicationService.Current.UserIdleDectionMode = IdleDetectionMode.Disabled;

沒有留言:

張貼留言