应用程序转到后台时无法处理已完成的后台任务

时间:2016-06-14 10:53:11

标签: uwp windows-10-mobile background-task

我希望在收到Raw Push Notification之后从后台任务收到完成的事件时执行一些任务(在这种情况下,它显示Toast通知)。但我有一个问题:

当应用程序运行调试时,它正常工作,主项目可以处理来自后台任务的已完成事件并显示Toast通知但是当我运行没有调试的应用程序并转到后台时,它不起作用,之后没有显示任何内容应用程序收到原始通知。

这是我的代码: 在主项目中,我已经注册了一个后台任务:

    private async void initBackgroundTask()
    {
        string myTaskName = "Ktask";
       var status =  await BackgroundExecutionManager.RequestAccessAsync();
        // check if task is already registered
        foreach (var cur in BackgroundTaskRegistration.AllTasks)
            if (cur.Value.Name == myTaskName)
            {                    
                cur.Value.Unregister(true);
            }
        try
        {
            // register a new task
            BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
            taskBuilder.Name = myTaskName;
            taskBuilder.TaskEntryPoint = typeof(KBackgroundStuff.KBackgroundTask).ToString();
            taskBuilder.SetTrigger(new PushNotificationTrigger());

            //taskBuilder.SetTrigger(new TimeTrigger(15, false));
            BackgroundTaskRegistration myFirstTask = taskBuilder.Register();
            myFirstTask.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); ;
            await (new MessageDialog("Task registered")).ShowAsync();
        }
        catch(Exception e)
        {
            Debug.WriteLine("trigger " + e.Message);
        }            
    }

处理后台任务中的已完成事件:

    private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
    {
        // TODO: Add code that deals with background task completion.
        ToastTemplateType toastTemplate = ToastTemplateType.ToastText02;
        XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
        XmlNodeList textElements = toastXml.GetElementsByTagName("text");
        textElements[0].AppendChild(toastXml.CreateTextNode("Notification - Yeah"));
        textElements[1].AppendChild(toastXml.CreateTextNode("I'm message from your Notification!"));
        ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(toastXml));


    }

后台任务:

public sealed class KBackgroundTask : IBackgroundTask
{

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
        RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
        string content = notification.Content;
        System.Diagnostics.Debug.WriteLine(content);            
        _deferral.Complete();
    }


}

请帮助我的主项目在没有调试的情况下运行应用程序时可以从后台任务接收完成的事件。对不起我的英文

1 个答案:

答案 0 :(得分:2)

当您的应用程序转到后台时,不应显示Toast通知。在您的代码中,您发送Toast通知以处理后台任务的完成事件。但是,在BackgroundTaskCompletedEventHandler delegate备注中,它已声明:

  

仅当应用程序位于前台时完成任务时才会传递完成事件。如果应用程序暂停然后终止,则不会提供完成状态。如果申请被暂停然后恢复,则保证收到完成通知。

当您的应用程序转到后台时,它将暂停,因此您无法看到Toast通知。

  

当应用程序运行调试时,它正常工作,主项目可以处理来自后台任务的已完成事件并显示Toast通知。

这是因为在使用Visual Studio进行调试时, Visual Studio会阻止Windows挂起附加到调试器的应用程序。这是为了允许用户在应用程序运行时查看Visual Studio调试UI。

因此,在调试时,您的应用程序实际上始终在前台运行。有关详细信息,请参阅How to trigger suspend, resume, and background events for Windows Store apps in Visual Studio