前言
在微薄中“有人”(我記得是誰,^_^)問起Windows Phone在鎖屏下是否繼續連結WiFi,引起了很多WP微博控在討論,其實我本來不關心這個問題的,因為這個是不可控的,但是討論的人太多了,因此我想聊聊我對Windows Phone的網路連接策略的想法。
問題定義
這個問題可以簡單的重新定義為Windows Phone在空閑(idle)情況下,是否進行網路連結。到底使用哪種連結方式,是由Windows Phone的策略所決定的,這種策略基本上是考慮電池使用量和連結成本($$$$$$$)等因素。
多任務之夢
如果有人覺得Windows Phone是單任務,在鎖屏的時候會把所有app殺死了,那麼他/她可能給水軍給忽悠了,Windows Phone從第一天開始就是一個多任務作業系統,所以在鎖屏情況下繼續保持網路連結,繼續完成背景工作是可能的。但微軟一般不這樣做,而且限制app開發人員這樣做,這些都是為了提供更好的使用者體驗。
到底連結or斷開?
我的答案是yes and no,呵呵。在Windows Phone鎖屏的情況下,到底繼續保持連結還是取消連結,不能簡單的回答,因為這個操作是根據策略來決定的。這些策略的目的都是為了提供更好的使用者體驗,這種策略簡單可以參考下面的公式:
任務類型 + 電源狀態 = 是否取消連結
根據之前重新定義,公式可以替換為:
任務類型 + 電源狀態 + 可用網路連結媒體(WiFi/3G) = 是否進行網路連結
也就是說在不同的情況下,Windows Phone會相應的保持或者取消連結。這也是現代智能手機系統(WP, Android,iOS)最最基本的功能了。現代的智能手機系統一般都由系統來進行電源管理和網路連接管理。請注意我把“系統”兩個字重點加粗了,因為非現代智能手機系統可能是把主動權交給了應用(app)來管理的(當然最終作業系統保留了最高決定權),例如以前的Windows Mobile是由應用來決定開啟和關閉網路連接,開啟3G還是WiFi,試問一個app開發人員怎麼要肩負著OS開發人員的責任,需要考慮的情況也太多了。再例如Symbian的app在啟動是會提示“是否開啟網路連接,到底開啟3G還是WiFi”,把連結責任推給了使用者。這些老系統都極大破壞了使用者體驗。
-------------------------貌似合理的跑題-------------------------------------------------------------------------------------
下面舉一個Agile的例子,討論一下使用者到底要什麼:
最為一個非技術使用者,如果我想看微薄,那麼開啟微薄app就可以看。
這裡的非技術使用者根本就不關心手機的連結狀態,關心的是是否能查看和發微薄。
這裡使用者故事有以下的附加條款(acceptance criteria):
1.如果能接觸(這裡沒有使用連結,其實也是這個意思,connect)到微薄後台服務,直接開啟app,顯示預設頁,例如“@我的”
2.如果不能接觸到微薄後台服務,而且沒有緩衝,提示使用者沒網路連結,請稍候再試。
3.如果不能接觸到微薄後台服務,而且有緩衝,提示使用者只能看緩衝。
這個使用者故事有個特點是,不由使用者來決定,而是預定動作,強迫使用者選擇或接受,但是假裝很尊重使用者的樣子。回到Jobs那句話,給使用者最好的選擇就是不給他選擇。
-------------------------跑回到主題上------------------------------------------------------------------------------------
由此可以知道關心這種問題的都不是“非技術使用者”,對,我就是說你,0_^。其實Windows Phone已經把管理網路連結的主動權收合來,統一由系統進行管理,作為app開發人員不一定要把這個問題查根問底也能寫出很優秀的程式,但是如果真的想知道,我下面儘力探討一下。
什麼時候Windows Phone在空閑狀態會進行網路連結
上面講到網路連結的策略,因此我們開發的app符合這些策略,就會在空閑狀態下也進行網路連結。我儘力列出所有可能出現的情況:
ApplicationIdleDetectionMode設定為disabled
Windows Phone的app可以通過修改PhoneApplicationService的ApplicationIdleDetectionMode強制app在鎖屏的時候不會被墓碑化(注意Mango發布後這個功能有時候是雞肋了),這種程式一般是導航程式,音樂播放程式(mango後有替代方案,會在後面講述),也就是手機鎖屏,app還是繼續運行,程式可以繼續做一些網路request,這樣WiFi連結就會保持(如果有WiFi連結的話)。但是根據微軟的文檔,在程式鎖屏情況下應該停止/關閉很多操作,例如Timer,動畫(animations ),重力加速計(accelerometer ),地理定位服務(Location Service ),FM收音機,同時斷開網路連結等等。但是注意我這裡使用了應該,沒有說必須,因此app還是可以繼續做網路請求的。
Background Audio
使用AudioPlayerAgent(後台音頻播放)的app在鎖屏的時候也可以繼續播放,如果音訊url指定為網路的url,那麼為了能正常播放,Windows Phone繼續保持WiFi連結如果WiFi可用的話。
Background File Transfers
如果app使用了BackgroundTransferService(後台傳輸服務),那麼程式會在特定情況下保持連結,繼續下載,如果檔案小於20M,Windows Phone會繼續使用3G下載,如果檔案100M以下,那麼Windows Phone會繼續使用WiFi下載檔案,如果檔案大於100M,必須外接電源和聯通WiFi的情況下Windows Phone才會啟動下載。
Background Agents
如果app使用了ScheduledTask(定時任務),那麼程式在每隔一段時間會啟動執行一下,可能有兩種不同的任務如下
PeriodicTask (週期性任務)會每隔30分鐘執行一次,每次只能執行25秒。
ResourceIntensiveTask (耗資源的任務)每隔10分鐘執行一次,但是需要串連上外接電源。
其中兩種任務在執行過程都可以連結網路,請求網路資源的。
Schedule Tile
如果app使用了ShellTileSchedule(資訊塊更新任務),那麼程式每隔一段時間可以更新Live Tile,如果Tile的圖片在網路上,會啟動網路連結。
Tile Notification
官方沒有說明推送任務的實現細節,從系統角度看一般實現方法可能如下:
1.通過sms觸發手機去請求。
2.手機定時pull(拉)資訊。
不管哪種方法,手機最終都是需要通過網路連結來取得推送服務的資訊,因此也可能使用到網路連結。
總結
不管哪種方法,微軟試圖做的是提供良好的使用者體驗(包括電源消耗,反映速度,通訊資費等等),因此作為app開發人員,我們要做的是在現有的限制條件下,提供更好的使用者體驗,沒必要為了資料長連結而破壞使用者體驗。
有任何問題,請留言,或者微博我 @林永堅jake 謝謝!
廣告時間
一年一度的墨爾本杯又來了,看馬看美女的時候到了,一起來下來免費Melbourne Cup app吧。
http://http://windowsphone.com/s?appid=8801c39f-519c-48a1-a21a-2585ddb851d4
http://http://windowsphone.com/s?appid=8801c39f-519c-48a1-a21a-2585ddb851d4
任何建議都welcome,謝謝!