WP7一直以顺畅的操作著称,但是保证顺畅操作的背后,却是另很多开发人员头痛的API限制.在7.0中开发人员甚至没有办法在程序非前台的情况下执行任何代码.这无疑限制了很多功能的实现.但是好在微软在mango中,开放了一些后台处理的API接口,至少缓解了这些矛盾. 在mango中,多任务的执行方式,执行时间依然不能由开发人员个人控制,而是通过后台代理的方式来实现.系统会在他认为一个合适的时间来启用这个代理.微软考虑了大多数情况下,后台任务所需要的执行方式,给出了以下几个接口:
1.后台音频
2.计划任务
3.后台文件传输
4.计划通知
后台音频,显而易见,是为了程序能够在非前台的情况下能够继续播放音频而设计的.例如绝大多数的播放软件.
计划任务分为PeriodicTask和ResourceIntensiveTask,PeriodicTask被称之为定时代理,他大概每30分钟会最多运行25秒的时间.ResourceIntensiveTask被称为资源密集型代理,资源密集型代理一次最多运行10分钟,但是他有诸多限制,其苛刻程度甚至有可能会让代理永远不会运行.这篇文章着重讲PeriodicTask也就是定时代理的实现.
后台文件传输可以在后台执行HTTP/HTTPS协议的文件上传下载.
计划通知允许应用程序在预定义的时间在前台弹出一次性的警报和提醒.
PeriodicTask,即定时代理的实现:
前面讲到PeriodicTask会每30分钟运行最多25秒的时间,所以这种模型成为了解设备状态和应用状态的最好方式,依托于.net的强大封装,创建一个PeriodicTask代理,同样不会很复杂,但是他比GPS和ProgressIndicator之类的API,要复杂得多.
首先,你需要在解决方案中,新建一个Scheduled Task Agent,
创建好之后,VS会自动生成许多代码,找到protected override void OnInvoke(ScheduledTask task) 方法,这就是在代理执行时,你需要实现的功能.
然后,在Phone Application项目中添加对刚刚新建的代理项目的引用.
最后在你想要添加后台代理的地方,添加如下代码:
string periodicTaskName = "PeriodicAgent";
PeriodicTask periodicTask = ScheduledActionService.Find(periodicTaskName) as PeriodicTask;
if (periodicTask != null)
{
try
{
ScheduledActionService.Remove(periodicTaskName);
}
catch (Exception)
{
}
}
periodicTask = new PeriodicTask(periodicTaskName);
periodicTask.Description = "This demonstrates a periodic task.";
try
{
ScheduledActionService.Add(periodicTask);
// If debugging is enabled, use LaunchForTest to launch the agent in one minute.
#if(DEBUG_AGENT)
ScheduledActionService.LaunchForTest(periodicTaskName, TimeSpan.FromSeconds(60));
#endif
}
catch (InvalidOperationException exception)
{
if (exception.Message.Contains("BNS Error: The action is disabled"))
{
MessageBox.Show("Background agents for this application have been disabled by the user.");
}
}
好了,至此,一个PeriodicTask 后台代理就已经添加完成,系统会每30分钟执行一次.还有个问题,就是在调试的时候,我们不可能每次都等30分钟,微软提供了一个方法,可以设置在调试模式下代理的执行时间,
#if(DEBUG_AGENT)
ScheduledActionService.LaunchForTest(periodicTaskName, TimeSpan.FromSeconds(60));
#endif
要让这段代码生效,需要在cs文件顶部,添加一句 #define DEBUG_AGENT.需要注意的是,这段代码只有在通过部署工具部署到手机上时,才会生效.提交到市场之后,执行时间依然是30分钟一次.
本文章同步发表在WPDevN:http://www.wpdevn.com/showtopic-26.aspx