`
hunxiejun
  • 浏览: 1146571 次
文章分类
社区版块
存档分类
最新评论

Background Agent and Scheduled Task

 
阅读更多
在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 VibrateController
Microsoft.Devices NowPlaying
Microsoft.Devices.Radio 所有API都不支持
Microsoft.Devices.Sensors 所有API都不支持
Microsoft.Phone.BackgroundAudio BackgroundAudioPlayer
Microsoft.Phone.BackgroundTransfer Add(BackgroundTransferRequest)
Microsoft.Phone.Controls WebBrowser
Microsoft.Phone.Info IsKeyboardDeployed
Microsoft.Phone.Notification 所有API都不支持
Microsoft.Phone.Scheduler Add(ScheduledAction)
Microsoft.Phone.Shell 只支持这三个API

·ShellToast

·Update(ShellTileData)

·Delete()

Microsoft.Phone.Tasks 所有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都不支持
GeoCoordinateWatcher 这个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。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics