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(, 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 方法。
- 在该任务的 Run 方法中设置一个断点。
- 按 F5 或点击“调试”>“启动调试”以部署和运行该应用。
- 应用启动后,切换回 Visual Studio。
- 确保显示“调试位置”工具栏。该工具栏位于“查看”>“工具栏”菜单。
- 在“调试位置”工具栏上,单击“挂起”下拉菜单,然后选择你的后台任务.
- Visual Studio 会在断点位置挂起执行。
- 按 F5 点击“调试”>“继续”以继续运行该应用。
- 按 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>
下一次我们再通过几个实例来熟悉一下后台任务操作!下方的广告,你懂的!
windows phone 8.1 开发:后台任务详解的更多相关文章
- WP8.1开发:后台任务详解(求推荐)
小梦今天给大家分享一下windows phone 8.1中的后台任务如何实现,许多应用都会用到后台任务,所以我们必须得掌握. 新建后台任务类: 首先我们先新建一个windows phone 8.1空白 ...
- Windows驱动——读书笔记《Windows驱动开发技术详解》
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(五)图解通过Fiddler加速开发
Fiddler是Windows底下最强大的请求代理调试工具,监控任何浏览器的HTTP/HTTPS流量,窜改客户端请求和服务器响应,解密HTTPS Web会话,图4.44为Fiddler原理示意图. 图 ...
- Python开发技术详解PDF
Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...
- 《python开发技术详解》|百度网盘免费下载|Python开发入门篇
<python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby 内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- Extjs MVC开发模式详解
Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...
随机推荐
- 字符集编码与Python(一)编码历史
编码历史 ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于 ...
- 2017年Unity开发环境与插件配置安装(总体介绍)
最近(2017年初)有朋友问,Unity客户端开发如何在机器配置一般的情况下,配置更高效的开发环境,进一步加快开发进度. 推荐如下: Win10(或者Win8)+Unity5.5.1版本(2017年2 ...
- 自己开发轻量级ORM(一)
在开发ORM之前,先简单的介绍下ORM的基本概念. 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的 ...
- 私有成员的设置和访问方式——set()和get()方法
在定义类时,为了保证类中成员数据安全性及的封装性,防止成员数据值被任意修改,通常将类中成员属性用private进行修饰. 被private所修改的成员变量,只能在类中访问,跳出本类中,就无法直接访问. ...
- Python之字符串详解1
1. 查看类型 name = 'allen' print(type(name)) #查看类型 <class 'str'> #类型为str age = 19 print(type(name) ...
- 学习笔记--jQuery基础
学习笔记也算总结知识点,有些示例可能没有具体到元素,直接给出的语法.大家有基本理解在看可能会好些. jQuery使用前提,需要安装jQuery库 jQuery 库是一个 JavaScript 文件,您 ...
- 原生js实现轮播图
原生js实现轮播图 很多网站上都有轮播图,但找到一个系统讲解的却很难,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计 ...
- ReactNative入门(2)ECMAScript 6简介
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...
- AMD的cpu如何安装Mac OS
AMD的cpu如何安装Mac OS 经过一个月的折腾,终于成功的安装了自己的Mac系统,并且能够成功的启动.在这里分享一下自己安装的经验. 为了安装方便,有不影响原来的系统的使用 ...
- BZOJ 2424: [HAOI2010]订货(费用流)
裸的费用流了= =从源点向每个点连费用为di,从汇点向每个点连流量为ui,每个点向下一个点连费用为m,流量为s的边就行了 CODE: #include<cstdio>#include< ...