[Windows Phone] 爲應用添加後臺計劃任務 – Scheduled Task Agent

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

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

1. 創建Windows Phone Silverlight Application項目:

 

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

 

3. App是我們的主程序,Scheduled是後臺定時任務代理程序:

 

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秒彈出如下提示:

 

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

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

 

 

<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()
{
    if (_tskPeriodic != null && _tskPeriodic.IsScheduled)
        return _tskPeriodic.Description;
    return string.Empty;
}
複製代碼

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

 

private void button1_Click(object sender, RoutedEventArgs e)
{
    StartPeriodicTask();
}
private void button2_Click(object sender, RoutedEventArgs e)
{
    StopPeriodicTask();
}
複製代碼

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

 

 

這樣就完成了,我們運行一下看看,首先啓動程序:

 

點擊Start Agent後退回到主屏並找到設置中的後臺任務:

 

這裏顯示你的程序後臺任務開啓,我們也可以點擊它進行關閉,過10秒鐘可以看到如下提示:

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章