標籤:c style class blog code java
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();}