2017-03-22 1 views
1

Windows Phoneのタイマーバックグラウンドタスクは、アプリケーションがVisual Studioからデバッグモードで実行されている場合にのみ起動されます。しかし、デバッグバイナリをデバッグせずに起動しても、15分後ではなく、数時間後ではなく動作しません。私はそれをWindows Phone 8.1エミュレータとノキアlumia 920でテストしました - 同じ結果:デバッグセッションでは動作します(システムによって起動され、デバッグロケーションツールバーから手動で起動できます)。Windows phone app 8.1 - バックグラウンドタスクが起動していません

私もWindowsストアアプリを持っており、時間のバックグラウンドタスクはかなりうまく機能します。私wp8.1プロジェクトのマニフェストで

  1. 私が追加しました:

    <Extension Category="windows.backgroundTasks" EntryPoint="data.TimerHandler"> 
         <BackgroundTasks> 
           <Task Type="timer" /> 
         </BackgroundTasks> 
    </Extension> 
    
  2. は、と名前空間「データ」クラス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コンポーネント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 
        } 
    } 
    } 
    
  4. 追加参照:電気ショック療法、「データ」(私はメインアプリでクラスMyTimerManagerに使用したのと同じ名前空間) 追加されたクラスのTimerHandlerにそのデフォルトの名前空間を設定します。

同じ名前空間を使用することが非常に重要である:私はそれを実現するまで私のWindowsストアアプリ8.1のバックグラウンドタスクで焼成されませんでした。 MSFTのドキュメントでは、これについて一言も言いません!

アプリが起動するたびにsetupAlarm()が呼び出され、ログにタスクの名前が表示されます(すべて正常でした)。しかし、何も起こりません。 このタスクをLifecircle Eventsコントロールから手動で起動すると、通知が表示されます。このコードが書かれた1ヵ月前に私が覚えている奇妙なことは、私は通知を見た。私はmsftドキュメントですべてをチェックしましたが、すべてうまく見えます。タスクを解雇するために他に何をすべきですか?

答えて

0

いくつかの例では、タスクを登録する前にRequestAccessAsyncを呼び出す必要があることが分かりました。それがトリックでした。

BackgroundExecutionManager.RequestAccessAsync.AsTask().ContinueWith(
     (t) => registerMyTasks()).ConfigureAwait(false); 
:あなたはRequestAccessAsyncが終了するまで、私は同期コードでそれを呼び出す必要があったので、私はそのようにそれをやった待つ必要があります手段の前に

関連する問題