前言
在微薄中“有人”(我记得是谁,^_^)问起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,谢谢!