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(); }