Windows Phone 8.1 后台任務


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM