天天看點

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

前段時間做過一個天氣應用,一直是隻支援前台擷取資料,上周末參加了Windows Phone的CodeJam和高手們交流了一下,發現實作背景定時更新功能也不是很難,于是在網上找一些資料,在找資料的過程中發現,網上的一些文章和代碼把這個本來很簡單代碼能實作的功能描述的很複雜,結合了很多無關功能,這就讓剛接觸Scheduled Task Agent的朋友覺得很難找到關鍵代碼,是以我寫這篇文章讓大家用最少的代碼實作主題功能。

首先說一下我的需求,其實很簡單,我就是要在背景定時能執行一段代碼而已,下面的例子即可實作,各位開發者可以在之上擴充得到自己想要的功能。

1. 建立Windows Phone Silverlight Application項目:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

2. 再建立一個基于Windows Phone Scheduled Task Agent的項目:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

3. App是我們的主程式,Scheduled是背景定時任務代理程式:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

4. 我們打開ScheduledAgent.cs這個檔案,用下面代碼替換掉OnInvoke方法:

public static string PERIODICTASKNAME = "PeriodicTaskTest";

/// <summary> 

/// Agent that runs a scheduled task 

/// </summary> 

/// <param name="task"> 

/// The invoked task 

/// </param> 

/// <remarks> 

/// This method is called when a periodic or resource intensive task is invoked 

/// </remarks> 

/// 

protected override void OnInvoke(ScheduledTask task) 

    //TODO: Add code to perform your task in background 

    if (task.Name == PERIODICTASKNAME) 

    { 

        ShellToast toast = new ShellToast(); 

        toast.Title = "Good: "; 

        toast.Content = "Get the Service!"; 

        toast.Show(); 

    } 

    else 

        //如果不是指定的task, 則代表不需要執行 

    ScheduledActionService.LaunchForTest(PERIODICTASKNAME, TimeSpan.FromSeconds(10));

    NotifyComplete(); 

}

以上代碼主要的功能是讓這個代理每隔10秒彈出如下提示:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

這樣代理端的代碼就編寫完成,就這麼簡單的代碼,按照自己的需求在OnInvoke方法裡添加自己的背景更新邏輯即可,接着就來編寫前端代碼。

5. 在MainPage.xaml中添加兩個按鈕:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

<Button Content="Start Agent" Height="72" HorizontalAlignment="Left" Margin="118,207,0,0" Name="button1" VerticalAlignment="Top" Width="211" Click="button1_Click" /> 

<Button Content="Stop Agent" Height="72" HorizontalAlignment="Left" Margin="120,285,0,0" Name="button2" VerticalAlignment="Top" Width="203" Click="button2_Click" />

6. 編寫背景代碼:

首先程式加載時添加如下代碼,這裡我添加在MainPage中:

public static string PERIODICTASKNAME = "PeriodicTaskTest"; 

public PeriodicTask _tskPeriodic;

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 

    ScheduledAction tTask = ScheduledActionService.Find(PERIODICTASKNAME); 

    if (tTask != null) 

        _tskPeriodic = tTask as PeriodicTask; 

接着添加幾個方法來開啟或關閉代理以及判斷代理是否存在和擷取代理資訊:

private void StartPeriodicTask() 

    _tskPeriodic = new PeriodicTask(PERIODICTASKNAME); 

    _tskPeriodic.Description = "BgScheduledAction Sample, update tile by webserivce"; 

    if (IsTaskStart() == false) 

        ScheduledActionService.Add(_tskPeriodic); 

        ScheduledActionService.LaunchForTest(PERIODICTASKNAME, TimeSpan.FromSeconds(10)); 

private void StopPeriodicTask() 

    ScheduledActionService.Remove(PERIODICTASKNAME); 

private bool IsTaskStart() 

    if (_tskPeriodic != null && _tskPeriodic.IsScheduled) 

        return true;

    return false; 

private string GetTaskDescription() 

        return _tskPeriodic.Description;

    return string.Empty; 

最後在兩個按鈕的單擊事件代碼中加入如下内容:

private void button1_Click(object sender, RoutedEventArgs e) 

    StartPeriodicTask();

private void button2_Click(object sender, RoutedEventArgs e) 

    StopPeriodicTask(); 

至此還沒有完成,切記最後一步要把代理項目的引用加入到主程式中,如果不做這部不會有任何報錯,但是無法實作效果,需要注意:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent
[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

這樣就完成了,我們運作一下看看,首先啟動程式:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

點選Start Agent後退回到主屏并找到設定中的背景任務:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

這裡顯示你的程式背景任務開啟,我們也可以點選它進行關閉,過10秒鐘可以看到如下提示:

[Windows Phone] 為應用添加背景計劃任務 – Scheduled Task Agent

代碼成功,這段代碼的内容非常簡單,希望對大家有所幫助,謝謝!

繼續閱讀