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