Windows Phone 8.1 應用能夠添加多個後臺任務,以輔助應用完成某些任務。async
(1)新建前臺應用ide
後臺任務是依託於前臺應用的,因此必須擁有一個前臺應用。測試
該前臺應用的功能很簡單,就是讀取文件中保存的文本;然後臺任務就是將當前時間寫入文件中。ui
前臺界面:spa
<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>
打開應用時就讀取文本信息:code
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 項目blog
後臺任務必須爲 Windows Runtime Component。繼承
(3)編寫一個繼承自 IBackgroundTask 接口的類接口
在後臺任務的項目中新建一個類,並繼承 IBackgroundTask 接口,實現 Run 方法,該類還必須爲 sealed:string
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(); }