Фоновая задача при выходе из спящего режима, отображаемая только один раз - UWP - PullRequest
0 голосов
/ 07 мая 2018

Я создал задание, работающее в фоновом режиме для получения SMS. Я последовал примеру самих окон в качестве поддержки.

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/SmsSendAndReceive

однако, когда мое приложение закрыто и окна находятся в спящем режиме, при возврате приложение отображает только одно из нескольких сообщений, которые оно должно показать.

Когда приложение открыто или закрыто, однако с работающими окнами все сообщения приходят нормально.

private async void Register_BackgroundTask()
    {
        var settings = ApplicationData.Current.LocalSettings;           
        try
        {
            var access = await BackgroundExecutionManager.RequestAccessAsync();
            switch (access)
            {
                case BackgroundAccessStatus.Unspecified:
                    break;
                case BackgroundAccessStatus.AlwaysAllowed:
                    break;
                case BackgroundAccessStatus.AllowedSubjectToSystemPolicy:
                    break;
                case BackgroundAccessStatus.DeniedBySystemPolicy:
                    break;
                case BackgroundAccessStatus.DeniedByUser:
                    break;
                default:
                    break;
            }

            SmsMessageType _messageType = SmsMessageType.Text; // set as Text as default
            _messageType = SmsMessageType.Text;

            SmsFilterRule _filterRule = new SmsFilterRule(_messageType);

            SmsFilterActionType _type = SmsFilterActionType.Accept;
            _type = SmsFilterActionType.Accept;

            SmsFilterRules _Rules = new SmsFilterRules(_type);
            IList<SmsFilterRule> rules = _Rules.Rules;
            rules.Add(_filterRule);

            BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
            SmsMessageReceivedTrigger trigger = new SmsMessageReceivedTrigger(_Rules);

            taskBuilder.SetTrigger(trigger);
            taskBuilder.TaskEntryPoint = BackgroundTaskEntryPoint;
            taskBuilder.Name = BackgroundTaskName;

            foreach (var cur in BackgroundTaskRegistration.AllTasks)
            {
                if (cur.Value.Name == BackgroundTaskName)
                {                       
                    return;                        
                }
            }

            BackgroundTaskRegistration taskRegistration = taskBuilder.Register();
            taskRegistration.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);

            //LOG              
        }
        catch (Exception ex)
        {
            //LOG               
        }          
    }

Метод запуска:

public void Run(IBackgroundTaskInstance taskInstance)
    {
        var deferal = taskInstance.GetDeferral();      
        taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);                       
        DisplayToast(taskInstance);
        deferal.Complete();
    }

Показать тост:

    private void DisplayToast(IBackgroundTaskInstance taskInstance)
    {
        try
        {              
                SmsMessageReceivedTriggerDetails smsDetails = taskInstance.TriggerDetails as SmsMessageReceivedTriggerDetails;
                SmsTextMessage2 smsTextMessage;

                if (smsDetails.MessageType == SmsMessageType.Text)
                {
                    smsTextMessage = smsDetails.TextMessage;                        

                    XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);                           
                    XmlNodeList stringElements = toastXml.GetElementsByTagName("text");                        
                    stringElements.Item(0).AppendChild(toastXml.CreateTextNode(smsTextMessage.From));
                    stringElements.Item(1).AppendChild(toastXml.CreateTextNode(smsTextMessage.Body));

                    ToastNotification notification = new ToastNotification(toastXml);
                    ToastNotificationManager.CreateToastNotifier().Show(notification);                        
                }
            // Message ACK to operator
            smsDetails.Accept();
            }
        catch (Exception ex)
        {
            Debug.WriteLine("Error displaying toast: " + ex.Message);               
        }
    }

Я знаю, что влияет на энергосбережение батареи, но даже когда я захожу в настройки окон и выбираю управление приложением, управляемое пользователем и позволяющее выполнять задачи в фоновом режиме, при выходе из спящего режима приходит только 1 сообщение.

Если я не изменю этот параметр, он не получит никаких сообщений даже при работающих окнах

Есть ли другие конфигурации, которые можно выполнить, чтобы при выходе из режима ожидания отображались все тосты?

1 Ответ

0 голосов
/ 09 мая 2018

Я создал пример кода с вашим кодом. Но я не смог воспроизвести вашу проблему. Он работает на моей стороне, даже если приложение закрыто и окна находятся в спящем режиме. Единственная разница в том, что я объявил cellularMessaging в возможностях приложения.

<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
         xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
         xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" 
          xmlns:r="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
         IgnorableNamespaces="uap mp r">

      ......

 <Capabilities>
    <r:Capability Name="cellularMessaging" />
  </Capabilities>
</Package>

И это пример кода , на который вы могли бы ссылаться.

...