在Wp7.1中实现了多任务,允许应用程序在后台运行。通过Scheduled Task 和 Back Agent可以使程序在后台运行。
BackgroundAgent
是ScheduledTaskAgent, AudioPlayerAgent, AudioStreamAgent所有具有后台运行功能Agent的基类。
ScheduledTaskAgent
用于实现ScheduledTask,这个类包含一个OnInvoke方法,当ScheduledTask执行后会被调用。
ScheduledTask
包含PeriodicTask和ResourceIntensiveTask两种 Task。
PeriodicTask
可以使程序在后台运行,这个Task只能定期的运行在很少的时间量和很有限的设备资源上。
ResourceIntensiveTask
这个Task可以使用很多的设备资源,并且需要运行较长的时间周期,但是却很少运行。
后台运行不支持的API
命名空间 |
不支持的 API |
Microsoft.Devices |
Camera |
Microsoft.Devices |
|
所有API都不支持 | |
所有API都不支持 | |
所有API都不支持 | |
只支持这三个API · Delete() | |
所有API都不支持 | |
Microsoft.Xna |
所有XNA API都不支持 |
System.Windows |
MessageBox |
System.Windows |
Clipboard |
System.Windows.Controls |
MediaElement |
System.Windows.Controls |
MultiScaleImage |
System.Windows.Media |
LicenseAcquirer |
System.Windows.Media |
A/V Capture |
System.Windows.Navigation |
所有API都不支持 |
这个API 在后台运行时,不能实时获取数据,而是每10分钟更新一次Cached Location值。 |
内存使用要求
Periodic agents 和Resource-intensive agents 使用内存不能大于 5 MB 。Audio agents可以使用 15 MB内存。如果超过这个范围 Scheduled Task就会被立即终止。
ExpirationTime
通过Secheduled Task对象的ExpirationTime可以设置这个Task的运行时间,但最大不能超过两个星期。当应用程序在前台运行时,会重设当前时间为开始时间。
示例:
1. 创建工程
在新建工程面板中选择Windows Phone Task Scheduler Agent模板,这时开发工具会创建一个ShceduledTaskAgent工程做为一个项目的后台。
在这个工程中会自动生成一个TaskScheduler.cs文件,这个文件创建了一个继承ScheduledTaskAgent的类TaskScheduler,这个类用来响应ScheduledTask的执行。这个工程将生成一个库文件。
publicclassTaskScheduler : ScheduledTaskAgent
{
protectedoverridevoidOnInvoke(ScheduledTask task)
{
//在这里添加ScheduledTask执行后所要运行的代码
NotifyComplete();
}
protectedoverridevoidOnCancel()
{
base.OnCancel();
//在这里添加ScheduledTask运行结束后所要运行的代码,比如清除一些资源等
}
}
再这个项目中,再增加一个Windows Phone Application工程,做为程序的前台。并且将后台生成的库加入进来。
voidMainPage_Loaded(object sender, RoutedEventArgs e)
{
StartPeriodicTask();
if (IsTaskStart())
textBlock1.Text = GetTaskDescription();
}
privatevoidStartPeriodicTask()
{
_tskPeriodic = newPeriodicTask(PERIODICTASKNAME);
_tskPeriodic.Description = "启动PeriodicTask";
if (ScheduledActionService.Find(PERIODICTASKNAME) != null)
StopPeriodicTask();
ScheduledActionService.Add(_tskPeriodic);
}
privatevoidStopPeriodicTask()
{
ScheduledActionService.Remove(PERIODICTASKNAME);
}
privateboolIsTaskStart()
{
if (_tskPeriodic != null&& _tskPeriodic.IsScheduled)
returntrue;
elseif (_tskRI != null&& _tskRI.IsScheduled)
returntrue;
returnfalse;
}
privatestringGetTaskDescription()
{
if (_tskPeriodic != null&& _tskPeriodic.IsScheduled)
return _tskPeriodic.Description;
elseif (_tskRI != null&& _tskRI.IsScheduled)
return _tskRI.Description;
returnstring.Empty;
}
privatevoidStartRITask()
{
_tskRI = newResourceIntensiveTask(RITASKNAME);
_tskRI.Description = "启动ResourceIntensiveTask";
if (ScheduledActionService.Find(RITASKNAME) != null)
StopRITask();
ScheduledActionService.Add(_tskRI);
}
privatevoidStopRITask()
{
ScheduledActionService.Remove(RITASKNAME);
}
2. 运行效果
退出程序,进入设置,在应用程序下面的 Background task可以看到这个程序正在后台运行,并且可以关闭这个后台运行的task。