Я создал задание, работающее в фоновом режиме для получения 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 сообщение.
Если я не изменю этот параметр, он не получит никаких сообщений даже при работающих окнах
Есть ли другие конфигурации, которые можно выполнить, чтобы при выходе из режима ожидания отображались все тосты?