Windows Phone 8.1 应用可以添加多个后台任务,以辅助应用完成某些任务。

(1)新建前台应用

后台任务是依托于前台应用的,所以必须拥有一个前台应用。

该前台应用的功能很简单,就是读取文件中保存的文本;而后台任务就是将当前时间写入文件中。

前台界面:

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions> <Viewbox Margin="20,0">
<TextBlock x:Name="timeTextBlock"
Text="Time"/>
</Viewbox> <Grid Grid.Row="1" Margin="20,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> <Button x:Name="registerButton"
Content="Register Task"
Margin="0,0,5,0"
HorizontalAlignment="Stretch"
Click="registerButton_Click"/>
<Button x:Name="unregisterButton" Grid.Column="1"
Content="Unregister Task"
Margin="5,0,0,0"
HorizontalAlignment="Stretch"
Click="unregisterButton_Click"/>
</Grid>
</Grid>

打开应用时就读取文本信息:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
await ShowFileText();
} private async Task ShowFileText()
{
file = await ApplicationData.Current.LocalFolder.CreateFileAsync("Time.txt", CreationCollisionOption.OpenIfExists);
timeTextBlock.Text = await FileIO.ReadTextAsync(file);
}

(2)添加一个 Windows Runtime Component 项目

后台任务必须为 Windows Runtime Component。

(3)编写一个继承自 IBackgroundTask 接口的类

在后台任务的项目中新建一个类,并继承 IBackgroundTask 接口,实现 Run 方法,该类还必须为 sealed:

public sealed class WritingTask: IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
var deferral = taskInstance.GetDeferral(); await WriteTimeToFile("Time.txt"); deferral.Complete();
}   private async Task WriteTimeToFile(string path)
  {
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(path, CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, DateTimeOffset.Now.ToString());
}
}

Run 方法就是后台任务执行时的方法。

(4)前台应用 Manifest 中添加后台任务

可以设置触发器的类型,记得设置后台任务的入口点。

然后前台应用添加后台任务项目的引用。

(5)前台应用对后台任务进行注册与解除注册

最后的一步也就是在前台应用中对后台任务进行注册了:

private async void registerButton_Click(object sender, RoutedEventArgs e)
{
BackgroundExecutionManager.RemoveAccess();
await BackgroundExecutionManager.RequestAccessAsync(); RegisterTask();
} private static void RegisterTask()
{
SystemTrigger triger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false); BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = "WritingTask";
taskBuilder.SetTrigger(triger);
taskBuilder.TaskEntryPoint = typeof(ZMyBackgroundTasks.WritingTask).FullName;
taskBuilder.Register();
}

这里选择的触发器为“当时区改变时”,这只是为了方便测试,你可以根据需要自行选择。

解除注册的方法为:

private void unregisterButton_Click(object sender, RoutedEventArgs e)
{
var task = BackgroundTaskRegistration.AllTasks.Values.First();
task.Unregister(true);
BackgroundExecutionManager.RemoveAccess();
}

最新文章

  1. Spring AOP深入剖析
  2. 不下载SDK启动Android Studio
  3. servlet1
  4. Android实现分享内容到微信朋友圈
  5. &amp;&amp; 用法解释
  6. HDU3695 - Computer Virus on Planet Pandora(AC自动机)
  7. 使用MMS(MongoDB Monitoring Service)监控MongoDB
  8. HDU 5863 cjj&#39;s string game
  9. c# API接收Base64转图片
  10. 【项目经验】Mockito教程
  11. docker限制容器内存使用上限
  12. iOS------自动查找项目中不用的图片资源
  13. Ubuntu下搜狗输入法无法输入中文
  14. Visualforce控制器
  15. Kafka.net使用编程入门(三)
  16. CQRS/ES框架调研
  17. Googleplay从服务器检索信息时出错。[DF-DFERH-01]
  18. 【数据结构】【平衡树】treap
  19. java文件遍历
  20. MyBatis(3)开发dao方法

热门文章

  1. javascript创建对象的方法--构造函数模式
  2. 外部事件触发调用对象方法时this指向问题
  3. Vue的学习--遇到的一些问题和解决方法
  4. HDU 2489 Minimal Ratio Tree(prim+DFS)
  5. Fragment 实现的 分类 效果
  6. Google Web Toolkit(GWT) 在windows下环境搭建
  7. 2.Web开发过程流程图
  8. Eclipse如何从导入SVN上导入项目
  9. M1卡操作
  10. 【原创】面向对象版本地CPU资源占用监控脚本