Windows Phone应用程序Tombstone执行模型总结
一、WP第三方应用程序限制
WP一次仅允许一个第三方应用程序在前台运行,这就意味着用户在操作手机的时候只能开启一个第三方应用,让人觉得WP是一个单任务操作系统。
但是和普遍理解的单任务操作系统不同,WP提供了一种机制,这就是Tombstone(墓碑),它能够让用户在不同的第三方应用之间切换时保留用户曾经的操作状态(这是多任务操作系统最擅长做的事情),提升用户体验。
二、Tombstone
Tombstone直译过来就是“墓碑”,还可以直观理解为休眠、挂起、暂停或者冻结等等,在WP中它表示程序终止的一个标记,但是不能理解为彻底终结进程并退出应用程序。
Tombstone能够为Windows Phone提供以单任务的能力完成多任务的功能。如何才能实现以单任务的能力完成多任务的功能?
答案就是WP提供的Tombstone执行模型。
三、WP生命周期
在讲Tombstone执行模型前先熟悉下WP的生命周期。
Tombstone是WP生命周期里一个重要的状态,它是以事件为执行模型的。所谓一图胜千言,我们通过两张图片对比下WP7和WP7.5生命周期管理的异同:
1、WP7应用程序生命周期过程
2、WP7.5应用程序生命周期过程
在下面的图中,圆圈表示应用程序的状态,矩形显示应用程序应管理其状态的应用程序级别或页面级别的事件。
注:图片均来源于参考博客。
四、Tombstone执行模型
1、执行过程
Tombstone是以事件为执行模型的。在WP7中,一共有4个基本的处理事件:Launching(启动)、Closing(关闭)、Activated和Deactivated。每一次应用程序的激活,最少会触发其中的一个事件。程序是否Tombstone,完全依据程序当前进入的事件,这些事件由项目下的入口文件App.xaml.cs进行管理和描述。
新建一个WP项目,打开项目下的App.xaml.cs,可以看到如下4个基本事件的处理函数:
Events
其中,Application_Deactivated就是事件发生Tombstone时执行的行为,Application_Activated就是为Tombstone恢复状态时发生的事件行为。
我们可以针对这四个事件,为Tombstone的产生(Deactivated事件)和解除(Activated事件)编程做些处理,比如当产生Tombstone时进行临时数据的保存等,而解除Tombstone时将临时数据取出,对于用户而言,一存一取正好保证了用户体验的一致性。
2、处理事件
(1)、Launching事件
Launching(进入)事件是每一个第三方应用在第一次运行时都必须执行的事件,它主要负责应用程序的初始化。这个事件与Closing事件是对应的,一个运行正常的应用程序执行了Launching事件,最后必然也要执行Closing事件。
Launching事件必须是第一次启动执行的,对于处于Tombstone解除状态的应用程序不会执行该事件。
这个事件的特点:当程序第一次启动时会调用,当程序重新激活时不调用。
(2)、Activated事件
Activated(激活)事件是Tombstone的核心。判断一个应用程序是否进入Tombstone,只需观察Activated事件是否已经在执行。这个事件适合读取一些临时数据的操作。
每一个激活的应用程序都是用户在手机前台应用中能够直观感受到的,此时你可以认为这个前台应用已经激活。
这个事件的特点:当程序重新激活的时候调用,当程序启动时不调用。
(3)、Deactivated事件 (应用进入Tombstone的事件)
Deactivated(失去激活)事件与Activated事件一起组成了完整的Tombstone。也就是说当应用程序执行Deactivated事件,该应用会处于Tombstone(休眠状态),能够再次唤醒应用的只有Activated事件。
但是必须注意,Deactivated(失去激活)事件是孤立的,并不和哪个事件一一对应,也就是说程序处于Deactivated,可以再触发Launching、Closing和Activated事件中的任何一个。
下面是几种常见的WP执行Deactivated事件的场景:
a、用户单击Start按钮回到主屏幕或者启动另一个应用程序;
b、手机屏幕被锁定;
c、电话呼入或者收到新短信;
d、推送服务或者其他消息提醒;
e、电池电量低强制弹出警告。
这个事件的特点:当程序失去激活的时候调用,当程序关闭的时候不调用。
(4)、Closing事件
Closing(关闭)事件是与Launching事件对应的,虽然一个应用程序未必会执行该事件(比如死机、手机没电或其他未捕获异常中断等)。
这个事件的特点:当程序关闭时调用该事件,当程序失去激活时则不调用。
大家可以参考下面的代码,分别跟踪在启动时、单击模拟器Start按钮以及Back按钮时VS的Output窗口的输出,加深对这四个事件的理解:
Events
参考:
http://msdn.microsoft.com/zh-cn/library/ff817008(v=VS.92).aspx
http://www.cnblogs.com/linzheng/archive/2011/02/14/1954764.html
作者:Jeff Wong
出处:http://jeffwongishandsome.cnblogs.com/
本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。