详解Windows Phone开发中的墓碑机制

2015-09-30 14:31:10来源:作者:人点击

目前的智能手机,硬件上已经可以媲美几年前的PC机了,1G内存,512M以上内存,3.5以上的屏幕,3G,WIFI等等都成为了新的手机的最低标准。而Windows Phone也一改以往WM手机硬件差异大的问题,设定了最低的硬件标准。相对于以前系统,性能上,操作上,流畅度上也有了很大提高。但是电池的发展远远跟不上手机的耗电量。大的也就1500MA的电池,最多也就使用1天多,大部分每天都用充电。为了节约电量,各个平台的手机都推出了一些省电的措施。

对于Windows Phone来说,刚推出时和iPhone第一版一样,不支持多任务,一方面是为了给前台程序提供更多的资源,更流畅的体验,另一方面也是为了介绍电池的消耗。同事采用了消息推送机制来完成一部分后台操作,也使用了一种名为墓碑机制来对实现所谓的了“伪多任务”。 到了最新的“芒果”系统,已经支持了多任务,但也不同于以往WM说或PC上的多任务,也改进了墓碑机制,加快了程序间的切换。我们这一篇文章就了解下Windows Phone平台的伪多任务。

一、伪多任务

在我们使用PC和WM系统时,多任务对我们来说是理所应当的。一边听歌,一边上QQ,还能上微博发照片。可到了Windows Phone上却不支持多任务了,对于一个新的智能系统来说,确实无法让人接受。但是多任务存在一个问题就是如果开的任务过多,系统用起来就会比较卡,在WM系统中这种情况比较常见。为了提供用户的体验,目前的一些智能系统都放弃了这种传统的多任务方式,而采用了伪多任务,有限制的多任务和消息推送这些方法。

所谓的伪多人他并不是真正的多任务,只是通过一些处理,让用户使用起来感觉不到和多任务有什么区别。在Windows Phone中采用了墓碑机制来实现伪多任务。墓碑这个名字也很恰当。当我们运行了一个程序后,切换到另一个程序,这时因为是单任务,第一个程序会被终止掉,但是采用墓碑机制,保存了程序当前的状态和数据,当我们在切换回的时候,虽然是启动了一个新的实例,但是可以通过墓碑来恢复到之前的状态,所以用户感觉不到有什么区别。

墓碑机制是系统自动完成的,但是数据的保存和恢复则是我们通过代码控制的。另外墓碑机制也不是万能的,因为此时程序是终止的,如果有一些下载,播放,计时的功能就无法通过墓碑机制完成到了。Windows Phone 7则通过推送机制来解决部分问题,而WP7.1 SDK中也提供了一些后台操作来解决这些问题,这一篇文章我们主要介绍墓碑机制。

二、程序执行模型

在深入了解墓碑机制之前我们必须弄清楚程序的执行模型。下面这个图就是Windows Phone 7.1中最新的执行模型。此图来自于MSDN,但是他的图有个错误,修改了下。

程序执行模型

对于一个Windows Phone程序来说,他有启动---运行---休眠---墓碑---退出等5个状态,状态切换之间存在一些事件和方法。下面就具体介绍一个程序从启动到终止的过程。

1.启动一个程序

我们启动一个程序有多种方法,最普遍的就是在第一屏界面点击程序的Tile图标或者是在第二屏中点击程序图标,另外我们可以通过点击一个推送的Toast消息或者通过Launchers 和 Choosers来启动程序,这些后面会介绍。在启动程序是,会触发Application的Launching事件。这个事件我们前面提到过,他是PhoneApplicationService类中注册的事件,除此之外好包含了三个和程序状态相关的事件。

程序启动会会创建一个新的实例,为了保证程序能过正常快速的启动,我们不应该在Launching事件中执行过多的代码,比如读取文件,网络连接等等,这样会印象用户体验,我们可用另起一个线程来执行这些操作。

2.程序运行

程序启动以后就进入了运行状态,程序从启动到进入第一个页面的过程我们在前面讨论页面导航的文章中详细介绍过了。通过从配置文件获得要加载的第一个XAML页面,读取XAML文件并生成新的实例,通过Frame显示出这个Page。我们知道在进入一个Page时会执行OnNavigatedTo方法。当这些完成后,程序才真正进入了运行状态。而OnNavigatedTo方法对于墓碑机制来说非常重要,我们一般在这个方法中进行一些数据恢复的操作。

3.休眠状态

这个状态是在WP7.1中新加入的一个状态,是为了提升多个任务间的切换速度。当我们在程序中点击Win键进入到主界面,或者是在程序中使用了Launchers 和Choosers启动了另一个程序时就会发生(不是所有都会发生)。休眠状态时,程序停止运行,但是整个进程还是存在于内存中。当恢复这个程序时,就不需要创建一个新的实例。这样就加快了程序恢复和切换的速度。而且从休眠状态恢复时我们一不需要去恢复数据。而在WP7.1中,我们可以长按Back按钮,出现程序列表,然后选择要前台执行的程序。

在切换到其他程序,进入到休眠状态之前,会调用当前页面的OnNavigatedFrom方法,在这个方法中我们可以保存当前页面的一些数据状态;然后会触发Application中的Deactivated事件,在这个事件中,我们可以保存一些当前程序的数据。我们知道,因为进程资源还保存在内存中,所以当前台程序使用时,内存不足或者不足以让程序流畅运行,这时系统就会执行一些操作来释放内存,此时程序就可能从休眠状态变换为下面介绍的墓碑状态。

4.墓碑状态

如上面说的,在WP7.1中,只有系统资源不够前台程序使用时,后台程序才可能从休眠状态进入到墓碑状态。这也是WP7.1相对于WP7.0最大的改进。在WP7.0中,系统没有休眠状态,仍和后台程序都是直接进入到墓碑状态,而OnNavigatedFrom方法和Deactivated事件都是在进入墓碑转台前触发的。一个程序进入到墓碑状态时,他的进程被终止掉,但是程序的回退栈中的信息,以及我们保存的一些信息会保留在内存中。

为了保证系统资源和性能,Windows Phone对墓碑状态也做了一些限制。目前系统中之允许同时存在5个墓碑程序。当超过了这个数量或者因为前台程序需要更多的资源,那么系统就会完全终止掉我们的程序,包括闪存内存中保存的回退栈和数据信息。所以对于我们而言,好需要对这种情况进行处理。

5.程序恢复

当我们使用Back按钮或者长按Back从任务列表中返回程序,或者是从Launchers 或Choosers返回时,程序就会恢复执行。但是如图上看到的,我们程序可能是从休眠状态,也可能是从墓碑状态返回的。如果是从休眠状态返回时我们不需要做任何恢复的操作,而从墓碑程序中返回,我们就需要恢复程序的状态和数据,以便用户感觉程序是被重写创建了。

程序恢复时会触发Application类中的Activated事件,我们可以通过检查IsApplicationInstancePreserved参数来判断程序是从休眠状态还是墓碑状态返回的,在此方法中我们可以用来恢复之前在Deactivated事件中保存的数据。如果是从休眠状态恢复,不会重新执行构造函数,而从墓碑状态恢复时会重新执行构造函数。因为Back Stack在墓碑状态中还是保存在内存中的,所以这是会返回到我们程序退出时所在的页面,在进入到页面之前还是会执行OnNavigatedTo方法,对于墓碑状态恢复的程序,我们可以在这个方法中来恢当前页面的状态数据。

6.程序结束

在Windows Phone的silverlight框架程序中,我们唯一退出程序的方法就是点击Back键,当Back Stack中不存在页面时程序就会退出,目前系统没有提供任何Exit方法来以代码的方式结束程序。在程序退出时会触发Application中最后一个事件,Closing。在这个事件中我们可以释放一些使用的资源,保存数据等等,要注意的是,如果一个程序从墓碑状态被结束,是不会触发此事件的。MSDN上说关闭程序的时间被限制在10s,超过这个时间程序会被终止掉。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台