windows phone 8.1 开发:后台任务详解

原文出自:http://www.bcmeng.com/backtask/

小梦今天给大家分享一下windows phone 8.1中的后台任务如何实现,许多应用都会用到后台任务,所以我们必须得掌握.

新建后台任务类:

首先我们先新建一个windows phone 8.1空白应用程序.然后请右键单击你的解决方案并依此选择“添加”->“新建项目”.选择 Windows 运行时组件项目类型,为该项目命名为Basktask.(名字都随便起了,只是为了后面方便)

在项目中,右键单击“引用”并选择“添加新引用”。在“解决方案”下,选择“项目”,然后选择Basktask.

将Basktask默认生成的类class1改为SimpleTask.并实现IBackgroundTask接口,在类中实现继承自接口的Run方法.

Run 方法是一个需要的入口点,当触发指定事件时,将调用该入口点;每个后台任务都需要该方法。

namespace Basktask
{
    public sealed class SimpleTask:IBackgroundTask
    {
       public   void Run(IBackgroundTaskInstance taskInstance)//后台任务入口
      {
        //后台需要执行的操作
      }
   }

如果你在后台任务中运行任何异步代码,则你的后台任务需要使用延迟。如果不使用延迟,则后台任务进程可能会意外终止(如果 Run 方法在完成异步方法调用之前完成)。调用异步方法之前,在 Run 方法中请求延迟。将延迟保存到某个全局变量以便可以从异步方法访问。完成异步代码之后声明延迟完成。
以下示例代码获取和保存延迟,并在异步代码完成后将其释放:

 public   void Run(IBackgroundTaskInstance taskInstance)//后台任务入口
      {

          deferral = taskInstance.GetDeferral();

           deferral.Complete();
      }

创建触发器对象

为了使得后台任务能够响应事件触发,我们需要注册触发器,当条件满足触发器被触发的时候,后台任务就会被执行.windows phone 8.1后台任务可以使用的触发器有SystemTrigger,TimeTrigger,LocationTrigger,

MaintenanceTrigger  PushNotificationTrigger RfcommConnectionTrigger DeviceChangeTrigger

BluetoothSignalStrengthTrigger GattCharacteristicNotificationTrigger.

下面我们简单介绍一下:

SystemTrigger:

SystemTrigger是系统事件触发器,以下事件会引发该触发器:UserPresent/Away, NetworkStateChange, InternetAvailable, SessionConnected, ServicingComplete, TimeZoneChange 等

注:LockScreenApplicationAdded and LockScreenApplicationRemoved 在windows phone 8.1中不在支持.

用法如下:

第一个参数 triggerType 指定了将激活此后台任务的系统事件触发器的类型。第二个参数 OneShot 指定后台任务是否将在下次发生系统事件并触发后台任务时,或在每次系统事件发生时运行一次,直至任务注销为止。

  SystemTrigger systemTrigger = new SystemTrigger(SystemTriggerType.InternetAvailable, false);

TimeTrigger:

如果后台任务需要周期性运行可以使用TimeTrigger .用法如下:

TimeTrigger timetrigger = new TimeTrigger(30, false);

注:最小时间间隔为 30分钟.

第二个参数 OneShot 指定后台任务是运行一次还是保持周期性运行。如果 OneShot 被设置为 true,则第一个参数 (FreshnessTime) 会指定在计划后台任务之前需等待的分钟数。如果 OneShot 被设置为 false,则 FreshnessTime 会指定后台任务的运行频率。

其余的触发器大家可以参考MSDN文档,用法都很简单.

创建后台任务对象:

     var SampleTask = new BackgroundTaskBuilder(); //创建后台任务实例
     SampleTask.Name = "SimpleBackTask";  //指定后台任务名称
     SampleTask.TaskEntryPoint = "Basktask.SimpleTask";//指定后台任务名称
     SampleTask.SetTrigger(timetrigger);//指定后台任务的触发器

添加后台任务运行条件(可选)

在触发器事件发生后,你可以添加条件控制任务何时运行。添加该条件之前,创建一个代表该条件的 SystemCondition 对象,该对象必须实际用于运行后台任务。在构造函数中,通过提供一个 SystemConditionType枚举值指定必须满足的条件。

添加后台任务运行条件(可选)

在触发器事件发生后,你可以添加条件控制任务何时运行。添加该条件之前,创建一个代表该条件的 SystemCondition 对象,该对象必须实际用于运行后台任务。在构造函数中,通过提供一个 SystemConditionType 枚举值指定必须满足的条件。

注册后台任务:

      var access = await BackgroundExecutionManager.RequestAccessAsync();
            if (access == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity)
            {
                BackgroundTaskRegistration task = SampleTask.Register();
                           }
            else if (access == BackgroundAccessStatus.Denied)
            {
                await new MessageDialog("您已禁用后台任务或后台任务数量已达最大!").ShowAsync();
            }

注:在 windows phone 8.1中,注册后台任务之前必须调用RequestAccessAsync()方法!

在应用清单中生命后台任务:

后台任务调试:

若要调试后台任务,请在该任务的 Run 方法中设置一个断点。 在“调试位置”工具栏中,选择你的后台任务。这将导致系统立即调用 Run 方法。

  1. 在该任务的 Run 方法中设置一个断点。
  2. 按 F5 或点击“调试”>“启动调试”以部署和运行该应用。
  3. 应用启动后,切换回 Visual Studio。
  4. 确保显示“调试位置”工具栏。该工具栏位于“查看”>“工具栏”菜单。
  5. 在“调试位置”工具栏上,单击“挂起”下拉菜单,然后选择你的后台任务.
  6. Visual Studio 会在断点位置挂起执行。
  7. 按 F5 点击“调试”>“继续”以继续运行该应用。
  8. 按 Shift+F5 或点击“调试”>“停止调试”以停止调试。

下面我们来看一个实例:

namespace Basktask
{
    public sealed class SimpleTask:IBackgroundTask
    {
        bool cancelRequested = false;// 用来表示是否已经请求取消后台任务
        BackgroundTaskDeferral deferral = null;//后台任务的延时
        ThreadPoolTimer periodicTimer = null;//计时器
        uint progress = 0; //用于保存后台任务的进度
        IBackgroundTaskInstance bTaskInstance = null;//提供对后台实例的访问

     public   void Run(IBackgroundTaskInstance taskInstance)//后台任务入口
      {
          taskInstance.Canceled += taskInstance_Canceled;
          deferral = taskInstance.GetDeferral();
          bTaskInstance = taskInstance;
          periodicTimer = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromMinutes(5));

      }

      private void PeriodicTimerCallback(ThreadPoolTimer timer)
      {
          if ((cancelRequested==false)&&(progress<100))
          {
              progress += 10;
              bTaskInstance.Progress = progress;
          }
          else
          {
              periodicTimer.Cancel();
              var settings = Windows.Storage.ApplicationData.Current.LocalSettings;
              var key = bTaskInstance.Task.Name;
              settings.Values[key] = (progress < 100) ? "Canceled" : "Completed";
              deferral.Complete();
          }
      }

      void taskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
      {
          cancelRequested = true;
      }
}
}
protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            foreach (var  task in BackgroundTaskRegistration.AllTasks)
            {
                if (task.Value.Name == "SimpleBackTask")
                {
                    task.Value.Progress += Value_Progress;
                    task.Value.Completed += Value_Completed;
                    UpdateUI("后台任务已经存在","");
                }
            }
        }

        private  async void UpdateUI(string p1, string p2)//更新UI
        {
            await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    progressText.Text = p1;
                    statusText.Text = p2;
                });
        }
        //处理后台任务完成事件
        void Value_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
        {
            UpdateUI("100%", "后台任务完成!");
        }
        //处理后台任务进度
        void Value_Progress(BackgroundTaskRegistration sender, BackgroundTaskProgressEventArgs args)
        {
            var progress = args.Progress + "%";
            UpdateUI("后台任务进行中:", progress);
        }

        private  async void registerButton_Click(object sender, RoutedEventArgs e)
        {
            TimeTrigger timetrigger = new TimeTrigger(30, false);

            var SampleTask = new BackgroundTaskBuilder(); //创建后台任务实例
            SampleTask.Name = "SimpleBackTask";  //指定后台任务名称
            SampleTask.TaskEntryPoint = "Basktask.SimpleTask";//指定后台任务名称
            SampleTask.SetTrigger(timetrigger);//指定后台任务的触发器

            SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);
            SampleTask.AddCondition(internetCondition);

            var access = await BackgroundExecutionManager.RequestAccessAsync();
            if (access == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity)
            {
                BackgroundTaskRegistration task = SampleTask.Register();
                task.Progress += Value_Progress; ;
                task.Completed += Value_Completed; ;
                UpdateUI("", "注册成功");

                registerButton.IsEnabled = false;
                cancelButtton.IsEnabled = true;

                var settings = Windows.Storage.ApplicationData.Current.LocalSettings;
                settings.Values.Remove(task.Name);
            }
            else if (access == BackgroundAccessStatus.Denied)//用户禁用后台任务或后台任务数量已达最大
            {
                await new MessageDialog("您已禁用后台任务或后台任务数量已达最大!").ShowAsync();
            }

        }

        private void cancelButtton_Click(object sender, RoutedEventArgs e)//删除后台任务
        {
            foreach (var task in BackgroundTaskRegistration.AllTasks)
            {
                if (task.Value.Name == "SimpleBackTask")
                {
                    task.Value.Unregister(true);//删除后台任务
                }
            }
            registerButton.IsEnabled = true;
            cancelButtton.IsEnabled = false;
            UpdateUI("","后台任务取消");
        }
    }
    <Grid>
        <StackPanel HorizontalAlignment="Center">

                <Button Name="registerButton"
                        Content="注册后台任务"
                         Click="registerButton_Click"></Button>
            <Button Name="cancelButtton"
                    Content="取消后台任务"
                    Click="cancelButtton_Click"></Button>
            <TextBlock Text=" 后台任务状态"
                         FontSize="25"></TextBlock>
            <TextBlock Name="statusText"
                        Text="未注册"
                       FontSize="25"></TextBlock>
            <TextBlock Text=" 后台任务进度"
                         FontSize="25"></TextBlock>
            <TextBlock Text="未开始进行"
                       Name="progressText"
                       FontSize="25">

            </TextBlock>

        </StackPanel>
    </Grid>

下一次我们再通过几个实例来熟悉一下后台任务操作!下方的广告,你懂的!

时间: 2024-08-10 15:10:28

windows phone 8.1 开发:后台任务详解的相关文章

WP8.1开发:后台任务详解(求推荐)

小梦今天给大家分享一下windows phone 8.1中的后台任务如何实现,许多应用都会用到后台任务,所以我们必须得掌握. 新建后台任务类: 首先我们先新建一个windows phone 8.1空白应用程序.然后请右键单击你的解决方案并依此选择“添加”->“新建项目”.选择 Windows 运行时组件项目类型,为该项目命名为Basktask.(名字都随便起了,只是为了后面方便) 在项目中,右键单击“引用”并选择“添加新引用”.在“解决方案”下,选择“项目”,然后选择Basktask. 将Bas

Cocos2d-x 3.X手游开发实例详解

Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰然网创始人杨雍力荐) 于浩洋 著   ISBN 978-7-121-23998-4 2014年9月出版 定价:59.00元 356页 16开 编辑推荐 以Cocos2d-x V3.0为框架全面讲解手游开发的知识和方法 以热门游戏2048.卡牌为例,完整再现手游的开发过程 Cocos2d-x作者之一林

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

Eclipse-Hadoop开发配置详解

Eclipse_Hadoop开发详解 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,l

免费的HTML5连载来了《HTML5网页开发实例详解》连载(五)图解通过Fiddler加速开发

Fiddler是Windows底下最强大的请求代理调试工具,监控任何浏览器的HTTP/HTTPS流量,窜改客户端请求和服务器响应,解密HTTPS Web会话,图4.44为Fiddler原理示意图. 图4.44  Fiddler原理示意图 Fiddler安装的系统要求为Windows XP或Windows 8中的版本,其中Fiddler2依赖于Microsoft.NET Framework 2.0,最新的Fiddler4依赖于Microsoft.NET Framework 4.0. Fiddler

Windows下安装Resin及配置详解与发布应用

关于Resin的好处,网上介绍了一大堆,小编经不住诱惑,决定试用一下.目前Resin的最新版本为:4.0.40,可以从官网直接下载. 1. 将下载下来的Resin包解压开,会看到一大堆的文件,有一些关键的文件,我们需要了解一下. resin-4.0.40 resin安装目录   --conf/resin.properties 配置属性   --conf/resin.xml 配置文件   --conf/licenses/ 许可信息文件   --conf/keys/ openSSL 秘钥   --w

《HTML 5网页开发实例详解》目录

第一篇  从宏观上认识HTML 5 讲述了HTML 5引发的Web革命.HTML 5的整体特性.HTML 5相关概念和框架和开发环境搭建. 第1章 HTML 5引发的Web革命 1.1  你是不是真的了解HTML 5 1.1.1  通过W3C认识HTML 5的发展史 1.1.2  HTML 5.HTML4.XHTML的区别 1.1.3  什么人应该学HTML 5 1.1.4  一个图告诉你如何学习HTML 5 1.2  浏览器之争 1.2.1  说说这些常见的浏览器 1.2.2  浏览器的兼容烦

Unity3D游戏开发之详解 Animation类和Animator类

Unity3D游戏开发之详解 Animation类和Animator类 Animation类 animation组件用于播放动画.可以指定动画剪辑到动画组件并从脚本控制动画播放.在Unity的动画系统基于权重并且支持动画融合,叠加动画,动画混合,标签和完全控制动画播放的各个方面. 如果想播放一个简单的动画,可以使用Animation.Play:如果想在动画之间交叉淡入,可以使用Animation.CrossFade:如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的Wra

Extjs MVC开发模式详解

Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式,开始将一个JS(Extjs)应用程序分割成Model-View-Controller三层,为JS应用程序的如何组织代码指明了方向,同时使得大规模JS代码变得更加易于重用和维护:这就是Extjs MVC开发模式的初衷. 在官方给出的MVC例子中,我们可以看到一个简单的列表编辑功能,这篇文章就围绕这个功能进