Windows Phone的网络连接策略
前言
在微薄中“有人”(我記得是誰,^_^)問起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,謝謝!
總結
以上是生活随笔為你收集整理的Windows Phone的网络连接策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uploadify初体验
- 下一篇: jQuery-Easyui 1.2 实现