为了在后台保存RAW notification
有效负载,我添加了一个Windows Runtime Component
项目来实现后台任务执行。
我设置了一个名为“BgTask'并实施了IBackgroundTask
和Run
方法。
namespace MyBgTask
{
public sealed class BgTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
var a = taskInstance.GetDeferral();
string taskName = taskInstance.Task.Name;
Debug.WriteLine("Background " + taskName + " starting...");
// Store the content received from the notification so it can be retrieved from the UI.
//RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
//var pushdata = JsonConvert.DeserializeObject<PushModelData>(notification.Content);
//var pushdata = notification.Content;
var pushdata = "anoop";
if (settings.Values.ContainsKey(taskName))
{
var dataaa = settings.Values[taskName].ToString();
Debug.WriteLine(dataaa);
var lst = JsonConvert.DeserializeObject<List<string>>(dataaa);
lst.Add(pushdata);
var seri = JsonConvert.SerializeObject(lst);
Debug.WriteLine("saving >>> " + seri);
settings.Values[taskName] = seri;
}
else
{
var lst = new List<string>();
lst.Add(pushdata);
var seri = JsonConvert.SerializeObject(lst);
Debug.WriteLine("saving >>> " + pushdata);
settings.Values[taskName] = seri;
}
Debug.WriteLine("Background " + taskName + " completed!");
a.Complete();
}
}
}
在Packagemanifest中,我将Pushnotification EntryPoint注册为
MyBgTask.BgTask
在主页面中我注册了任务
private async void Button_Click(object sender, RoutedEventArgs e)
{
BackgroundAccessStatus backgroundStatus = await BackgroundExecutionManager.RequestAccessAsync();
if (backgroundStatus != BackgroundAccessStatus.Denied && backgroundStatus != BackgroundAccessStatus.Unspecified)
{
try
{
PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
channel.PushNotificationReceived += OnPushNotification;
UnregisterBackgroundTask();
RegisterBackgroundTask();
}
catch (Exception ex)
{
// ... TODO
}
}
}
private void OnPushNotification(PushNotificationChannel sender, PushNotificationReceivedEventArgs args)
{
}
private void RegisterBackgroundTask()
{
BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
taskBuilder.TaskEntryPoint = "MyBgTask.BgTask";
taskBuilder.Name = "BgTask";
PushNotificationTrigger trigger = new PushNotificationTrigger();
taskBuilder.SetTrigger(trigger);
try
{
BackgroundTaskRegistration task = taskBuilder.Register();
task.Progress += task_Progress;
task.Completed += BackgroundTaskCompleted;
Debug.WriteLine("Registration success: ");
}
catch (Exception ex)
{
Debug.WriteLine("Registration error: " + ex.Message);
UnregisterBackgroundTask();
}
}
void task_Progress(BackgroundTaskRegistration sender, BackgroundTaskProgressEventArgs args)
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
Debug.WriteLine("progress");
});
}
private void BackgroundTaskCompleted(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
MessageBox.Show("Background work item triggered by raw notification with payload = " + " has completed!");
});
}
private bool UnregisterBackgroundTask()
{
foreach (var iter in BackgroundTaskRegistration.AllTasks)
{
IBackgroundTaskRegistration task = iter.Value;
if (task.Name == "BgTask")
{
task.Unregister(true);
return true;
}
}
return false;
}
在Packagemanifest中设置入口点。
当我使用大量代码向我的主项目发送原始通知时,pushnotification event
就会触发。但问题是,当事件触发时,Run方法中的代码块不会触发。它会自动退出
该计划&#39; [4484] BACKGROUNDTASKHOST.EXE&#39;具有 退出代码1(0x1)
每次都会发生。我创建了另一个示例空白windows phone silverlight项目并实现了后台任务。我通过发送RAW通知进行测试,现在它工作正常,Run方法中的代码块效果很好。请注意,两个项目都在同一个解决方案中。
我需要澄清以下内容 1.为什么后台任务在进入Run方法时会自动退出? 这是因为我的项目规模较大还是需要很高的应用程序内存? 3.我如何确定确切原因?
请帮我找出按预期工作的解决方案!
非常感谢
答案 0 :(得分:0)
我认为问题不在于BackgroundTask
你可以忽略exitcode 1.
我认为你的问题是:
你告诉操作系统创建一个新的触发器,当os收到BackgroundTask
时,它会启动一个新的PushNotification
。这个BackroundTask
是一个或多或少完全自己的应用程序,它将由os启动。您的应用和BackgroundTask共享的视图之一是ApplicationData.Current.LocalSettings
,您可以在应用和BackgroundTask
之间交换数据。
当您创建/注册触发器时,您会获得一个BackgroundTaskRegistration
对象,您可以使用该对象将当前正在运行的应用绑定到已完成的事件。
只要您的应用运行正常,一切都会正常运行,但如果您的应用暂停或关闭,您的应用可能会失去已完成事件的绑定。
如果您希望能够在应用未运行时向用户显示通知,请在BackgroundTask
中执行此操作。
如果您需要从BackgroundTask获取数据,即更新本地数据。将其保存到ApplicationData.Current.LocalSettings
并在每次应用启动或恢复时检查事件绑定。
请注意使BackgroundTask
变得简单,因为每个BackgroundTask每小时只有几秒的计算时间。