原文:与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务)

[索引页]
[源码下载]

与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务)

作者:webabcd

介绍
与众不同 windows phone 7.5 (sdk 7.1) 之后台任务

  • PeriodicTask - 周期任务
  • ResourceIntensiveTask - 资源密集型任务(通常用于手机与电脑同步数据)

示例
演示如何注册和运行 PeriodicTask 类型的任务和 ResourceIntensiveTask 类型的任务
1、后台代理
MyScheduledTaskAgent/ScheduledAgent.cs

/*
* 本例演示如何由后台任务定时弹出 Toast,以及如何定时更新应用程序瓷砖的 Badge
* 建议使用 ScheduledTaskAgent 类型的模板创建此项目
*
* BackgroundAgent - 后台代理类,抽象类,它是 ScheduledTaskAgent、AudioPlayerAgent 和 AudioStreamingAgent 的基类
* NotifyComplete() - 用于通知系统,代理已经完成了当前的任务,调用此方法后,系统才会去准备执行下一次任务
* Abort() - 用于通知系统,放弃此次和以后的任务,对应的 ScheduledAction 的 IsScheduled 将变为 false
*
* ScheduledTaskAgent - 后台计划任务代理类,抽象类
* OnInvoke(ScheduledTask task) - 后台任务每次执行时都会调用此方法
*
* ScheduledAgent - 用于演示后台任务的类,继承自 ScheduledTaskAgent,需要重写 ScheduledTaskAgent 的 OnInvoke() 方法
*
* DeviceStatus.ApplicationMemoryUsageLimit - 程序在此时被分配到的内存数量(单位:字节),每次获取此值可能都不一样,但是肯定不会超过 6MB
*
* ShellToast - 用于管理 Toast
* Title - Toast 的标题
* Content - Toast 的内容
* NavigationUri - 单击 Toast 之后链接到的目标地址(Uri 类型)
* Show() - 显示 Toast(注:如果 Show 方法的调用程序正在前台运行,则不会显示 Toast)
*
* ScheduledActionService.LaunchForTest(string name, TimeSpan delay)
* 对于 ScheduledTask 类型的任务,在指定的时间后马上执行任务。其用于开发目的,仅在开发工具部署的应用程序中有效
* PeriodicTask 和 ResourceIntensiveTask 均继承自 ScheduledTask
*/ using System.Windows;
using Microsoft.Phone.Scheduler; using Microsoft.Phone.Shell;
using Microsoft.Phone.Info;
using System;
using System.Linq; namespace MyScheduledTaskAgent
{
public class ScheduledAgent : ScheduledTaskAgent
{
/*
* _classInitialized - 用于标记 ScheduledAgent 是否已经被初始化
* 标记成 volatile 是为了避免编译器认为此字段无外部修改,而将其优化放入寄存器(标记成 volatile 的字段只会放在内存中)
* 一般来说,多任务环境下各任务间共享的字段应该被标记为 volatile
*/
private static volatile bool _classInitialized; public ScheduledAgent()
{
if (!_classInitialized)
{
_classInitialized = true; Deployment.Current.Dispatcher.BeginInvoke(delegate
{
Application.Current.UnhandledException += ScheduledAgent_UnhandledException;
});
}
}
private void ScheduledAgent_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
System.Diagnostics.Debugger.Break();
}
} protected override void OnInvoke(ScheduledTask task)
{
string toastTitle = ""; if (task is PeriodicTask)
toastTitle = "PeriodicTask";
else if (task is ResourceIntensiveTask)
toastTitle = "ResourceIntensiveTask"; string toastContent = "MemoryUsageLimit: " + DeviceStatus.ApplicationMemoryUsageLimit; // 弹出 Toast
ShellToast toast = new ShellToast();
toast.Title = toastTitle;
toast.Content = toastContent;
toast.NavigationUri = new Uri("/BackgroundTask/BackgroundAgentDemo.xaml?param=abc&param2=xyz", UriKind.Relative);
toast.Show(); // 更新应用程序磁贴的 Badge
ShellTile applicationTile = ShellTile.ActiveTiles.First();
StandardTileData newTile = new StandardTileData
{
Count = new Random().Next(, )
};
applicationTile.Update(newTile); #if DEBUG
// 15 秒后执行“task.Name”任务
ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds());
#endif NotifyComplete();
}
}
} /*
* 主程序引用此项目后,会在 manifest 中添加如下信息:
* <ExtendedTask Name="BackgroundTask">
* <BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="MyScheduledTaskAgent" Source="MyScheduledTaskAgent" Type="MyScheduledTaskAgent.ScheduledAgent" />
* </ExtendedTask>
*/

2、前台注册指定的后台代理
BackgroundAgentDemo.xaml

<phone:PhoneApplicationPage
x:Class="Demo.BackgroundTask.BackgroundAgentDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True"> <StackPanel Orientation="Vertical"> <Button Name="btnStartPeriodicTask" Content="Start Periodic Task Agent" Click="btnStartPeriodicTask_Click" />
<Button Name="btnStartResourceIntensiveTask" Content="Start Resource Intensive Task Agent" Click="btnStartResourceIntensiveTask_Click" /> <TextBlock x:Name="lblMsg" /> </StackPanel> </phone:PhoneApplicationPage>

BackgroundAgentDemo.xaml.cs

/*
* 本例演示:如何注册 PeriodicTask 类型的任务和 ResourceIntensiveTask 类型的任务
*
* ScheduledAction - 所有计划活动的基类,抽象类。ScheduledNotification 和 ScheduledTask 继承自此类
* Name - ScheduledAction 的名称,此名称即 ID
* ScheduledTask - 计划任务类,抽象类。PeriodicTask 和 ResourceIntensiveTask 继承自此类
* Description - 针对后台任务的描述,将显示在 设置->应用程序-后台任务 中
* 支持及不支持的 api 参见:http://msdn.microsoft.com/en-us/library/hh202962(v=vs.92)
* 内存使用的上限值为 6MB,具体上限值从 ApplicationMemoryUsageLimit 获取(根据实际情况每次获取到的值可能都不一样,但肯定不会超过 6MB)
* 一个计划任务最多执行两周,两周后要重新 ScheduledAction.Add(),每次 ScheduledAction.Add() 之后最多执行两周
* 任务连续两次崩溃之后将会被取消
*
* PeriodicTask - 周期任务
* PeriodicTask 每 30 分钟被执行一次,每次最多持续 25 秒
* ResourceIntensiveTask - 资源密集型任务(通常用于手机与电脑同步数据)
* ResourceIntensiveTask 每次最多持续 10 分钟
* 需要使用外部电源,或使用本机电池时电量在 90% 以上
* 需要 WiFi 或 PC 连接网络
* 必须在锁屏状态下且无手机呼叫
*
* ScheduledActionService - 管理 ScheduledAction 的类
* ScheduledActionService.GetActions<T>() where T : ScheduledAction - 查找系统中已注册的 ScheduledAction 类型的数据
* ScheduledAction.Find(string name) - 按名称查找指定的 ScheduledAction
* ScheduledAction.Remove(string name) - 按名称删除指定的 ScheduledAction
* ScheduledAction.Add(ScheduledAction action) - 注册一个新的 ScheduledAction
* ScheduledAction.Replace(ScheduledAction action) - 更新指定的 ScheduledAction
* ScheduledActionService.LaunchForTest(string name, TimeSpan delay) - 对于 ScheduledTask 类型的任务,在指定的时间后马上执行任务。其用于开发目的,仅在开发工具部署的应用程序中有效
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls; using Microsoft.Phone.Scheduler; namespace Demo.BackgroundTask
{
public partial class BackgroundAgentDemo : PhoneApplicationPage
{
private PeriodicTask _periodicTask;
private string _periodicTaskName = "PeriodicTask"; private ResourceIntensiveTask _resourceIntensiveTask;
private string _resourceIntensiveTaskName = "ResourceIntensiveTask"; public BackgroundAgentDemo()
{
InitializeComponent();
} protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
if (NavigationContext.QueryString.Count > )
{
lblMsg.Text = "参数 param 的值为:" + this.NavigationContext.QueryString["param"];
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "参数 param2 的值为:" + this.NavigationContext.QueryString["param2"];
} base.OnNavigatedTo(e);
} private void btnStartPeriodicTask_Click(object sender, RoutedEventArgs e)
{
// 实例化一个新的 PeriodicTask
_periodicTask = ScheduledActionService.Find(_periodicTaskName) as PeriodicTask;
if (_periodicTask != null)
ScheduledActionService.Remove(_periodicTaskName);
_periodicTask = new PeriodicTask(_periodicTaskName); _periodicTask.Description = "用于演示 PeriodicTask"; try
{
// 每次都注册一个新的 PeriodicTask,以最大限度避免两周后无法执行的问题
ScheduledActionService.Add(_periodicTask);
#if DEBUG
// 1 秒后执行任务
ScheduledActionService.LaunchForTest(_periodicTaskName, TimeSpan.FromSeconds());
#endif
}
catch (InvalidOperationException exception)
{
if (exception.Message.Contains("BNS Error: The action is disabled"))
{
// 代理已被禁用
}
if (exception.Message.Contains("BNS Error: The maximum number of ScheduledActions of this type have already been added."))
{
// 代理的数量超过了设备的限制(设备的最大代理数是由设备进行硬性限制的,最低值是 6)
}
}
catch (Exception ex)
{ }
} private void btnStartResourceIntensiveTask_Click(object sender, RoutedEventArgs e)
{
// 实例化一个新的 ResourceIntensiveTask
_resourceIntensiveTask = ScheduledActionService.Find(_resourceIntensiveTaskName) as ResourceIntensiveTask;
if (_resourceIntensiveTask != null)
ScheduledActionService.Remove(_resourceIntensiveTaskName);
_resourceIntensiveTask = new ResourceIntensiveTask(_resourceIntensiveTaskName); _resourceIntensiveTask.Description = "用于演示 ResourceIntensiveTask"; try
{
// 每次都注册一个新的 ResourceIntensiveTask,以最大限度避免两周后无法执行的问题
ScheduledActionService.Add(_resourceIntensiveTask);
#if DEBUG
// 1 秒后执行任务
ScheduledActionService.LaunchForTest(_resourceIntensiveTaskName, TimeSpan.FromSeconds());
#endif
}
catch (InvalidOperationException exception)
{
if (exception.Message.Contains("BNS Error: The action is disabled"))
{
// 代理已被禁用
}
if (exception.Message.Contains("BNS Error: The maximum number of ScheduledActions of this type have already been added."))
{
// 代理的数量超过了设备的限制(设备的最大代理数是由设备进行硬性限制的,最低值是 6)
}
}
catch (Exception ex)
{ }
}
}
}

OK
[源码下载]

与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务)的更多相关文章

  1. 与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载)

    原文:与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载) [索引页][源码下载] 与众不同 windows phone (13) ...

  2. 与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder)

    原文:与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder) [索引页][源码下载] 与众不同 windows p ...

  3. Windows 8.1 应用开发后台任务概述(Windows XAML)

    说到后台任务,这是在和许多 Android 开发者聊天的时候,经常被提起的话题之一, Windows 移动平台的后台任务的形式有别与 Android 的后台 service,简单的说在 Windows ...

  4. 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务

    [源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后 ...

  5. 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制

    [源码下载] 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台 ...

  6. 重新想象 Windows 8 Store Apps (66) - 后台任务: 下载和上传

    [源码下载] 重新想象 Windows 8 Store Apps (66) - 后台任务: 下载和上传 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台任务 后台 ...

  7. 重新想象 Windows 8 Store Apps (68) - 后台任务: 控制通道(ControlChannel)

    [源码下载] 重新想象 Windows 8 Store Apps (68) - 后台任务: 控制通道(ControlChannel) 作者:webabcd 介绍重新想象 Windows 8 Store ...

  8. 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector

    [源码下载] 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的 ...

  9. 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

    [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...

随机推荐

  1. oracle db server 改动主机名时的注意事项

    參考: Configuring The DB After Host Name Change (Doc ID 465545.1) 总结要点例如以下: 1. 注意改动listener.ora 和tnsna ...

  2. C# this关键字

    使用方式之一: this,在构造函数中使用. 当使用构造函数的重载时,可使用this关键字. //构造函数-重载 public Student(int id, string name, int age ...

  3. zoj3713 7Bit

    意思是把一行字符串的长度按照找7位一个字节输出,如果长度能够存在7位里,字节的最高位置0,否则只输出7位并且输出字节的最高位置1,直到全部输出长度. 要注意的是有空串要输出00,其他按照16进制输出就 ...

  4. Offer_1

    #include <iostream> #include <cstring> using namespace std; class CMyString { public: CM ...

  5. 在Android中显示GIF动画

    gif图动画在android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...

  6. hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

    题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...

  7. vim: 搭建vim看代码的环境

    使用 vim + ctags + cscope + taglist 阅读源码  http://my.oschina.net/u/554995/blog/59927 vim tab变空格 http:// ...

  8. BZOJ 3173: [Tjoi2013]最长上升子序列( BST + LIS )

    因为是从1~n插入的, 慢插入的对之前的没有影响, 所以我们可以用平衡树维护, 弄出最后的序列然后跑LIS就OK了 O(nlogn) --------------------------------- ...

  9. EFM32在使用IAR开发环境配置ICf文件以及指定程序存储地址空间

    EFM32在IAR开发环境下指定代码,数据的存储空间 为了便于后续的项目升级,管理,需要对代码,数据的存储空间加以设定,也在网上找下相关的资料,笔者水平有限, 如下内容不一定完全正确,如有错误之后,还 ...

  10. 【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试

    一. Fiddler内置命令. 上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的session不是同一个概念,这里的每条HTTP请求都成为一个sessio ...