说简单点,就是手机上一个任务被迫中断时(如有电话打入),系统记录下当前应用程序的状态后,(像把事件记录在墓碑上一样),然后中止程序。当需要恢复时,根据“墓碑”上的内容,将程序恢复到中断之前的状态。这样的一种机制就是“墓碑机制”
微软在今年发布了全新的Windows Phone 7手机操作系统,但令人不解的是,WP7却不支持多任务运行。据了解,WP7并不是严格的单任务,比如WP7中微软自家的IE和ZUNE就能同时运行。
首先来说一些WP7系统程序运行的基本规则,微软不允许任何第三方应用程序在WP7的后台运行,特定时间内只有一个应用程序的在前台运行,如果你的应用程序没有在前台显示,就表示这些程序并没有运行,这样就不耗费运行内存和处理器资源。这样做主要是为了延长电池续航时间,并保证响应一致的用户体验。
但是所有的WP7手机都将配备返回按钮硬件,这个按钮除了有返回导航功能之外,还将支持应用程序之间的切换,比如当你在某个应用程序时点击了里面的网页链接,然后调用内置浏览器进行查看,在查看完毕之后就可以按返回键重新返回刚才的程序。
现在问题就出来了,当前的应用程序切换回之前的应用时,究竟是恢复了一个应用还是重新打开了这个应用呢?因为刚才已经说过了,WP7不允许后台运行程序,而两者的区别就是,重新打开时不会保持刚才的使用状态,恢复是可以延续使用状态的,这就要说到微软的墓碑(Tombstone)机制了。
墓碑是微软为WP7切换应用程序状态的一种处理机制,以使用过程为例,当用户正在使用一个应用程序,比如游戏或者新闻阅读,这时有电话打进来,来电提示和通话页面将会在前台显示,正在运行的游戏就会消失,但是WP7不允许后台运行应用,这时候墓碑机制就会触发,游戏的运行状态包括画面、进度等等数据会冻结保存,相当于暂停,但是游戏确实没有运行,这也是墓碑名字的含义:应用程序已经死了,但是墓碑上记录有临终前的所有状态。当通话结束后,游戏操作系统会将应用程序进程重新启动,并将状态数据传递为应用进行恢复,这也相当于应用从墓地里面爬出来,并按照墓碑上记录的状态进行还原。
在程序代码示例中,微软给出了单个应用程序的运行状态代码,共有四个App.xaml.cs文件,这些直接关系到执行模式的代码分别是Application_ Launching、Application_ Activated、Application_ Deactivated、Application_ Closing,分别是启动、复活(激活程序恢复状态)、停用(记录墓碑数据)、关闭(彻底关闭)。开发者们需要注意的是,在开发过程中需要使用微软给出的工具和相关代码才能让自己的应用支持墓碑机制,否则当用户正在使用的时候突然一个电话过来之后就得再次手动打开程序重头再来,这会让用户非常不爽。
在早期的WP7系统中,微软并没有在程序不运行的时候将进程彻底杀死,而是将其暂停,但是这种情况导致了后台运行堆栈的混乱,API和事件触发经常会出现问题,所以微软才决定使用墓碑机制。
不过完全实行墓碑机制将会影响到电话的某些功能,比如短信、即时通信、天气等需要时刻保持运行和更新的应用,微软同样给出了推送通知服务(Push Notification Services)的API,允许应用程序调用该接口保持实时更新。