zoukankan      html  css  js  c++  java
  • Background Agent and Scheduled Task

     

    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

  • 相关阅读:
    博客写作技巧及规范
    2020年中总结
    运维笔记(一)——磁盘挂载与逻辑卷扩容
    mysql设计与优化(二)——配置主从
    mysql设计与优化(一)
    日志处理(一)
    坑爹问题—360自动填充账户密码
    mysql设计与优化
    java并发-ConcurrentMap
    FastDfs配置nginx
  • 原文地址:https://www.cnblogs.com/randylee/p/2087801.html
Copyright © 2011-2022 走看看