【Win10 应用开发】从前台应用触发后台任务
有关后台任务的使用,估计大伙伴们不会陌生,而且老周曾经在某文中也简单讲述过。说到后台任务,老周想到了一个问题:有人问,后台任务一定要独立写到一个Runtime组件中吗,能不能写到主项目的代码中?
老周严重地回答你:是可以的,在配置清单文件中,你只需要在Extension元素中指定Executable为主项目的.exe文件即可。
<Extension Category="windows.backgroundTasks" EntryPoint="……" Executable="xxxx.exe">
<BackgroundTasks>
……
</BackgroundTasks>
</Extension>
其实,Executable可以设置为$targetnametoken$.exe,这样在生成应用时,会自动用.exe文件的实际名称替换$targetnametoken$标签。
可是,老周非常严重地不推荐把后台任务写到主项目中,一则这不符合官方文档的常规性要求,不便于代码分类管理;二则,这种做法会带来严重的负面效果,如果后台任务激活时,前台应用没有运行倒无所谓,要是后台任务执行时前台应用正在运行,很可能会造成前台应用进程重启,给用户的感觉就是闪退。
好,上面只是给大家普及一下常识,建议大家在干活时最好按规矩办事,别老喜欢搞那些另类行为,另类不代表创新,只不过是幼稚罢了。
今天的主题是:我能不能在前台应用中,通过代码有目的地触发后任务呢?我们知道,常见的后台任务有后台音频、定时器、系统事件、网络传输控制等触发器,那有没有可以让我们手动去触发后台任务的触发器呢?
有,它的名字叫ApplicationTrigger,使用它,你在前台代码中就可以随时激活后台任务,而且还可以向后台任务传递参数。当需要执行后台任务时,直接调用ApplicationTrigger实例的RequestAsync方法即可,如果没有意外(比如泥石流、山体滑坡、地震等),那么后台任务就会执行。
原理已经跟大家交代了,下面还是用实例说话吧。
首先我定义了这么个后台任务,你猜猜它是干吗用的。
public sealed class BgTask : IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
var d = taskInstance.GetDeferral();
// 取出与触发器相关的数据
ApplicationTriggerDetails details = taskInstance.TriggerDetails as ApplicationTriggerDetails; if (details != null)
{
// 取出传递过来的参数
ValueSet ps = details.Arguments;
int na = Convert.ToInt32(ps["a"]);
int nb = Convert.ToInt32(ps["b"]); // 开始进行运算
int x = na;
int res = ;
while (x <= nb)
{
res += x;
x++;
await Task.Delay(); //延时
// 报告进度
ReportProgress(taskInstance, (uint)x, (uint)nb);
} // 保存计算结果
ApplicationData.Current.LocalSettings.Values["result"] = res;
}
d.Complete();
} private void ReportProgress(IBackgroundTaskInstance instance, uint c, uint t)
{
……
}
}
人品高尚的你一定看出来了,这个任务主要是做加法运算的,指定一个起始值和一个最终值,从起始值开始相加,一直加到最终值,每加一次就把操作数+1。其中,每一轮运算后会拖延30毫秒,目的是方便看进度。本任务不太严谨,比如它没有检测如果终值小于始值时怎么处理,大家知道就行了,老周不想把代码搞复杂,仅供演示。
然后你必须记得在主项目中引用写有后台任务类的Rutime组件项目。
接下来,配置一下清单文件,打开Package.appxmanifest文件,找到Application节点,注意不是Applications节点,没有s的,随后加入扩展点。
<Application Id="App" …… >
……
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.BgTask" >
<BackgroundTasks>
<Task Type="general"/>
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
<Task Type="general"/>表示该后任务是常规型,通用型,即大众化的后台任务,而不是精英级后台。
清单文件只是作声明,后台任务不会自动注册,需要用代码来完成注册。
const string TASK_NAME = "comptask";
private BackgroundTaskRegistration taskReg = null;
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
var res = await BackgroundExecutionManager.RequestAccessAsync();
if (res == BackgroundAccessStatus.Unspecified || res == BackgroundAccessStatus.Unspecified)
{
ShowMessage("后台任务被禁用。"); return;
} taskReg = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault(t => t.Name == TASK_NAME) as BackgroundTaskRegistration;
// 注册后台任务
if (taskReg == null)
{
BackgroundTaskBuilder bd = new BackgroundTaskBuilder();
// 入口点
bd.TaskEntryPoint = typeof(BackgroundTasks.BgTask).FullName;
// 任务名称
bd.Name = TASK_NAME;
// 设置触发器
ApplicationTrigger trigger = new ApplicationTrigger();
bd.SetTrigger(trigger);
taskReg = bd.Register();
ShowMessage("后台任务注册成功。");
}
// 添加事件处理
taskReg.Progress += TaskReg_Progress;
taskReg.Completed += TaskReg_Completed;
}
注册前应该访问BackgroundTaskRegistration.AllTasks看看你需要的后台任务是不是已经注册了,重复注册没有意义。
下面代码通过ApplicationTrigger来触发后台任务。
// 从注册的任务中取出触发器
ApplicationTrigger trigger = taskReg.Trigger as ApplicationTrigger; // 准备参数
ValueSet p = new ValueSet();
p["a"] = n1;
p["b"] = n2;
// 触发后台任务
var res = await trigger.RequestAsync(p);
switch (res)
{
case ApplicationTriggerResult.Allowed:
ShowMessage("后台任务已启动。");
break;
case ApplicationTriggerResult.CurrentlyRunning:
ShowMessage("后台任务已经在运行了。");
break;
case ApplicationTriggerResult.DisabledByPolicy:
ShowMessage("管理员不允许执行后台任务。");
break;
case ApplicationTriggerResult.UnknownError:
ShowMessage("发生错误。");
break;
}
在调用RequestAsync方法时,可以向后台任务传递数据,数据用ValueSet类封装,其实就是个字典模型,key为字符串。
方法调用后,会返回ApplicationTriggerResult枚举的值。如果值为Allowed表明后台任务已成功触发;如果为CurrentlyRunning表明后台任务还在运行中,“你所拨打的号码正在通话中,请稍后再试”;如果值为DisabledByPolicy表示后台任务被禁止了。
一切就绪,看看运行结果:
呈现计算结果。
本示例下载地址:http://files.cnblogs.com/files/tcjiaan/triggerbgtfromapp.zip
好了,肚子饿了,要开饭,今天的白菜猪肉汤比较nice。有网友提出,老周能不能写一写Win10中Toast通知和操作中心的一些新知识点。没问题的,下一篇烂文开始,老周就和大伙伴们一起研究一下Adaptive Generic Toast吧。
【Win10 应用开发】从前台应用触发后台任务的更多相关文章
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- 【Win10应用开发】自定义磁贴通知的排版
前面老周用了两篇烂文,向大家介绍了Adaptive磁贴的模板使用.那些XML模板已经很强大了,不过,如果你觉得那些排版还不足以满足需求,不妨试试自己来定义磁贴的内容. 其实,Runtime App支持 ...
- 背水一战 Windows 10 (119) - 后台任务: 后台下载任务(任务分组,组完成后触发后台任务)
[源码下载] 背水一战 Windows 10 (119) - 后台任务: 后台下载任务(任务分组,组完成后触发后台任务) 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 后台下 ...
- 背水一战 Windows 10 (116) - 后台任务: 前台程序激活后台任务
[源码下载] 背水一战 Windows 10 (116) - 后台任务: 前台程序激活后台任务 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 前台程序激活后台任务 示例演示后 ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...
- win10应用开发——如何判断应用是在手机上运行还是电脑上运行
原文:win10应用开发--如何判断应用是在手机上运行还是电脑上运行 在进行uwp应用开发的时候, 有时我们需要知道自己的应用是在手机端运行还是在桌面端运行,那么通过以下的api就可以进行判断: Wi ...
- Win10/UWP开发—使用Cortana语音指令与App的前台交互
Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调 ...
- Win10/UWP开发—使用Cortana语音指令启动前台App
这两天进群(53078485)找大咖的童鞋比较多,只是大咖比较忙,目前Demo还没有要到,这里先给大家转载一篇Aran大咖的博客学习下,以下是原文: Win10开发中最具有系统特色的功能点绝对少不了集 ...
随机推荐
- HTML5 学习笔记(一)——HTML5概要与新增标签
目录 一.HTML5概要 1.1.为什么需要HTML5 1.2.什么是HTML5 1.3.HTML5现状及浏览器支持 1.4.HTML5特性 1.5.HTML5优点与缺点 1.5.1.优点 1.5.2 ...
- PHP用户注册与登录【1】
需求分析 主要功能分为 用户注册.用户登录.用户退出.用户中心 四个部分. 用户注册 用户注册主要功能有: 注册信息表单填写界面 javascript 脚本初步检测用户输入的注册信息. 注册处理模块检 ...
- Angular初步
一.angular.js是什么? angular.js是一个javascript的框架,与jquery是一个级别的,区别是jquery主要是擅长dom操作,而angular主要是擅长绑定数据显示数据. ...
- Struts2中跳转问题
struts2 跳转类型 result type=chain.dispatcher.redirect(redirect-action) dispatcher 为默认跳转类型,用于返回一个视图资源(如: ...
- clear属性
clear:规定元素的哪一侧不允许其他浮动元素. clear 属性定义了元素的哪边上不允许出现浮动元素.在 CSS1 和 CSS2 中,这是通过自动为清除元素(即设置了 clear 属性的元素)增加上 ...
- 怎么统计指定文件夹下含有.xml格式的文件数目
如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...
- 【转】通过Hibernate将数据 存入oracle数据库例子
一. Hibernate介绍 Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案.ORM方案的思想是将对象模型表示的对象映射到关系型数据 ...
- 关于chrome控制台那些事
作为一名前端,除了编写完美代码之外(个人还不具备),当然也要会调试啦,对于firebug比较而言,我还是更喜欢chrome控制台比较多(可能使用较多,更顺手的原因吧).所以来总结下,关于chrome控 ...
- iOS 琐碎点------切某个或某几个角的圆角
不说废话----------> 1.如果是切四个角的圆角,代码示例: self.picImage.layer.cornerRadius = 8; self.picImage.layer.mask ...
- 控制TextField的内容长度
参考如下代码(下例是控制设置交易密码,控制6位): - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [ ...