从睡眠模式返回时的后台任务,仅显示一次 - UWP



我创建了一个在后台运行的任务来接收短信。我遵循了窗口本身作为支持的示例。

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

但是,当我的应用关闭且 Windows 处于睡眠模式时,在返回时,应用仅显示它应显示的几条消息之一。

但是,当应用程序打开或关闭时,当窗口运行时,所有消息都会正常到达。

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 条消息到达。

如果我不更改此设置,即使运行窗口也不会收到任何消息

是否可以进行任何其他配置,以便在从睡眠模式返回时显示所有 Toast?

我已经用你的代码创建了一个代码示例。但我无法重现您的问题。即使应用程序关闭并且窗口处于睡眠模式,它也可以在我身边工作。唯一的区别是我在应用程序的功能中声明了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>

这是您可以参考的代码示例。

最新更新