小梦今天给大家分享一下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(, 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 internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);
SampleTask.AddCondition(internetCondition);

注册后台任务:

  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 = ; //用于保存后台任务的进度
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()); } private void PeriodicTimerCallback(ThreadPoolTimer timer)
{
if ((cancelRequested==false)&&(progress<))
{
progress += ;
bTaskInstance.Progress = progress;
}
else
{
periodicTimer.Cancel();
var settings = Windows.Storage.ApplicationData.Current.LocalSettings;
var key = bTaskInstance.Task.Name;
settings.Values[key] = (progress < ) ? "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(, 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=""></TextBlock>
<TextBlock Name="statusText"
Text="未注册"
FontSize=""></TextBlock>
<TextBlock Text=" 后台任务进度"
FontSize=""></TextBlock>
<TextBlock Text="未开始进行"
Name="progressText"
FontSize=""> </TextBlock> </StackPanel>
</Grid>

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

WP8.1开发:后台任务详解(求推荐)的更多相关文章

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

    原文出自:http://www.bcmeng.com/backtask/ 小梦今天给大家分享一下windows phone 8.1中的后台任务如何实现,许多应用都会用到后台任务,所以我们必须得掌握. ...

  2. hadoop应用开发技术详解

    <大 数据技术丛书:Hadoop应用开发技术详解>共12章.第1-2章详细地介绍了Hadoop的生态系统.关键技术以及安装和配置:第3章是 MapReduce的使用入门,让读者了解整个开发 ...

  3. 《Hadoop应用开发技术详解》

    <Hadoop应用开发技术详解> 基本信息 作者: 刘刚 丛书名: 大数据技术丛书 出版社:机械工业出版社 ISBN:9787111452447 上架时间:2014-1-10 出版日期:2 ...

  4. Extjs MVC开发模式详解

    Extjs MVC开发模式详解   在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...

  5. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(三)DOCTYPE和字符集

    在2.1.2节中通过新老DOCTYPE的对比,读者可以清晰地看到HTML 5在精简旧有结构上做出的努力.DOCTYPE在出现之初主要用于XML中,用作描述XML允许使用的元素.属性和排列方式.起初HT ...

  6. Windows驱动——读书笔记《Windows驱动开发技术详解》

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  7. ​ 用一个开发案例详解Oracle临时表

    ​ 用一个开发案例详解Oracle临时表 2016-11-14 bisal ITPUB  一.开发需求  最近有一个开发需求,大致需要先使用主表,或主表和几张子表关联查询出ID(主键)及一些主表字段 ...

  8. 数据库开发-pymysql详解

    数据库开发-pymysql详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Python支持的MySQL驱动 1>.什么是驱动 与MySQL通信就是典型的CS模式.Se ...

  9. Axis2开发webservice详解

    Axis2开发webservice详解 标签: javawebserviceAxis2 2015-08-10 10:58 1827人阅读 评论(0) 收藏 举报  分类: JAVA(275)  服务器 ...

随机推荐

  1. Angular:了解Typescript

    Angular是用Typescript构建的.因此在学习Angular之前有必要了解一下Typescript. [ 类型 ] Typescript增加了类型系统,好处是: 1. 有助于代码编写,预防在 ...

  2. BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)

    Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...

  3. BZOJ3262: 陌上花开(三维偏序,CDQ分治)

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  4. SpringMVC,Mybatis,FreeMarker连接mycat示例(一)

    首页 > 程序开发 > 软件开发 > Java > 正文 SpringMVC,Mybatis,FreeMarker连接mycat示例(一) 项目结构如图: 首先是各种配置文件, ...

  5. 修改chrome的安装目录(默认的竟然安装在documents and settings目录,google真不厚道)

    修改chrome的安装目录(默认的竟然安装在documents and settings目录,google真不厚道) 把chrome从系统目录提取出来 Vista下,Win+R运行 C:/Users/ ...

  6. Redis的高级应用-安全性和主从复制

    Redis的服务器命令和键值命令(String,Hash,List,Set,Zset)相对简单,只需查看文档即可. 文档地址: http://www.runoob.com/redis/redis-tu ...

  7. ClickOnce

    Clic WPF ClickOnce应用程序IIS部署发布攻略   WPF程序非常适合公司内网使用,唯一缺点就是客户端要安装.net框架4.0.优势也很明显,在客户端运行的是一个WinForm程序,自 ...

  8. 基于zookeeper实现的分布式锁

    基于zookeeper实现的分布式锁 2011-01-27 • 技术 • 7 条评论 • jiacheo •14,941 阅读 A distributed lock base on zookeeper ...

  9. uva 10098 Generating Fast(全排列)

    还是用的两种方法,递归和STL,递归那个是含有反复元素的全排列,这道题我 没有尝试没有反复元素的排列,由于从题目上并没有发现一定是有反复元素的() 贴代码: <span style=" ...

  10. WebApp调用手机相册或摄像头、拨打电话

    WebApp调用手机相册或摄像头.拨打电话 一.总结 一句话总结:input标签,指定type为file,选择好对应的accept即可.camera——相机,相应的accept为image : cam ...