繁体   English   中英

Windows手机应用程序8.1 - 后台任务未启动

[英]Windows phone app 8.1 - Background Task is not launched

我的Windows Phone 8.1应用程序中的计时器后台任务仅在应用程序从Visual Studio以调试模式运行时被触发。 但是,如果我启动甚至调试二进制而不调试它不起作用,不是在15分钟之后,而不是几个小时之后。 我在Windows Phone 8.1模拟器和诺基亚lumia 920上测试了它 - 结果相同:在调试会话中它可以工作(它是由系统触发的,我可以从Debug Location工具栏手动启动),但是当手动启动app时没有任何反应。

我也有Windows应用程序应用程序和时间后台任务在其中工作得很好。

要使用后台任务,我执行了以下操作:

  1. 在我的wp8.1项目的清单中,我添加了:

     <Extension Category="windows.backgroundTasks" EntryPoint="data.TimerHandler"> <BackgroundTasks> <Task Type="timer" /> </BackgroundTasks> </Extension> 
  2. 使用此类方法(以及其他方法)在名称空间“data”类MyTimerManager中创建:

     public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint, string taskName, IBackgroundTrigger trigger, IBackgroundCondition condition) { foreach (var cur in BackgroundTaskRegistration.AllTasks) { if (cur.Value.Name == taskName) return (BackgroundTaskRegistration)(cur.Value); } var builder = new BackgroundTaskBuilder(); builder.Name = taskName; builder.TaskEntryPoint = taskEntryPoint; builder.SetTrigger(trigger); if (condition != null) builder.AddCondition(condition); BackgroundTaskRegistration task = null; try { task = builder.Register(); } catch (Exception e) { LogError(e); } return task; } public static bool UnRegisterBackgroundTask(string taskName) { foreach (var cur in BackgroundTaskRegistration.AllTasks) { if (cur.Value.Name == taskName) { ((BackgroundTaskRegistration)cur.Value).Unregister(false); return true; } } return false; } public static void setupAlarm() { TimeTrigger timerTrigger = new TimeTrigger(30, false); string entryPoint = "data.TimerHandler"; string taskName = "TimerHandler task"; UnRegisterBackgroundTask(taskName);//just in case BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, timerTrigger, null); Log("RegisterBackgroundTask: " + (task!=null ?task.Name:null)); } 
  3. 创建了winrt组件项目,将其Default Namespace设置为'data'(我在主应用程序中用于类MyTimerManager的名称空间)添加了类TimerHandler:

     namespace data { public sealed class TimerHandler : IBackgroundTask { BackgroundTaskDeferral deferral = null; public async void Run(IBackgroundTaskInstance taskInstance) { deferral = taskInstance.GetDeferral(); await BackgroundExecutionManager.RequestAccessAsync(); await backgroundTimerCallAsync(); deferral.Complete(); } public static async Task backgroundTimerCallAsync() { NotificationSender ns = new NotificationSender(false, null, null); ns.sendNotification("Timer task msg");//my code which sends notification } } } 
  4. 在我的wp8.1项目中添加了对winrt组件项目的引用。

使用相同的命名空间非常重要:在我的Windows Store 8.1应用程序中,任务在我意识到之前没有被触发。 在MSFT文档中没有一个关于它的单词!

每个应用程序启动我调用setupAlarm(),在日志中我看到任务的名称(一切都很好)。 但是没有任何事情发生 如果我手动启动此任务(从Lifecircle Events控件),我会看到我的通知。 我在几个月前写这段代码的时候记得很奇怪,我看到了通知。 我用msft docs检查了一切,但一切似乎都很好。 我还应该做些什么来解决任务?

在一些例子中,我发现你应该在注册任务之前调用RequestAccessAsync! 这就是诀窍。

之前意味着你必须等到RequestAccessAsync完成,我不得不在同步代码中调用它,所以我这样做:

    BackgroundExecutionManager.RequestAccessAsync.AsTask().ContinueWith(
        (t) => registerMyTasks()).ConfigureAwait(false);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM