posts - 114,  comments - 447,  trackbacks - 0
 

Wp7.1中实现了多任务,允许应用程序在后台运行。通过Scheduled Task Back Agent可以使程序在后台运行。

BackgroundAgent

ScheduledTaskAgent, AudioPlayerAgent, AudioStreamAgent所有具有后台运行功能Agent的基类。

ScheduledTaskAgent

用于实现ScheduledTask,这个类包含一个OnInvoke方法,当ScheduledTask执行后会被调用。

ScheduledTask

包含PeriodicTaskResourceIntensiveTask两种 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

posted on 2011-06-23 09:45 小镇 阅读(...) 评论(...) 编辑 收藏