Windows Phoneのタイマーバックグラウンドタスクは、アプリケーションがVisual Studioからデバッグモードで実行されている場合にのみ起動されます。しかし、デバッグバイナリをデバッグせずに起動しても、15分後ではなく、数時間後ではなく動作しません。私はそれをWindows Phone 8.1エミュレータとノキアlumia 920でテストしました - 同じ結果:デバッグセッションでは動作します(システムによって起動され、デバッグロケーションツールバーから手動で起動できます)。Windows phone app 8.1 - バックグラウンドタスクが起動していません
私もWindowsストアアプリを持っており、時間のバックグラウンドタスクはかなりうまく機能します。私wp8.1プロジェクトのマニフェストで
私が追加しました:
<Extension Category="windows.backgroundTasks" EntryPoint="data.TimerHandler"> <BackgroundTasks> <Task Type="timer" /> </BackgroundTasks> </Extension>
は、と名前空間「データ」クラス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)); }
作成されたwinrtコンポーネントproj私wp8.1プロジェクトにコンポーネントプロジェクトをWinRTのために
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 } } }
追加参照:電気ショック療法、「データ」(私はメインアプリでクラスMyTimerManagerに使用したのと同じ名前空間) 追加されたクラスのTimerHandlerにそのデフォルトの名前空間を設定します。
同じ名前空間を使用することが非常に重要である:私はそれを実現するまで私のWindowsストアアプリ8.1のバックグラウンドタスクで焼成されませんでした。 MSFTのドキュメントでは、これについて一言も言いません!
アプリが起動するたびにsetupAlarm()が呼び出され、ログにタスクの名前が表示されます(すべて正常でした)。しかし、何も起こりません。 このタスクをLifecircle Eventsコントロールから手動で起動すると、通知が表示されます。このコードが書かれた1ヵ月前に私が覚えている奇妙なことは、私は通知を見た。私はmsftドキュメントですべてをチェックしましたが、すべてうまく見えます。タスクを解雇するために他に何をすべきですか?