前段時間做過一個天氣應用,一直是只支持前台獲取數據,上周末參加了Windows Phone的CodeJam和高手們交流了一下,發現實現后台定時更新功能也不是很難,於是在網上找一些資料,在找資料的過程中發現,網上的一些文章和代碼把這個本來很簡單代碼能實現的功能描述的很復雜,結合了很多無關功能,這就讓剛接觸Scheduled Task Agent的朋友覺得很難找到關鍵代碼,所以我寫這篇文章讓大家用最少的代碼實現主題功能。
首先說一下我的需求,其實很簡單,我就是要在后台定時能執行一段代碼而已,下面的例子即可實現,各位開發者可以在之上擴展得到自己想要的功能。
1. 創建Windows Phone Silverlight Application項目:
2. 再創建一個基於Windows Phone Scheduled Task Agent的項目:
3. App是我們的主程序,Scheduled是后台定時任務代理程序:
4. 我們打開ScheduledAgent.cs這個文件,用下面代碼替換掉OnInvoke方法:
/// <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 ="Stop Agent" Height ="72" HorizontalAlignment ="Left" Margin ="120,285,0,0" Name ="button2" VerticalAlignment ="Top" Width ="203" Click ="button2_Click" />
6. 編寫后台代碼:
首先程序加載時添加如下代碼,這里我添加在MainPage中:
public PeriodicTask _tskPeriodic;
private void PhoneApplicationPage_Loaded( object sender, RoutedEventArgs e)
{
ScheduledAction tTask = ScheduledActionService.Find(PERIODICTASKNAME);
if (tTask != null)
{
_tskPeriodic = tTask as PeriodicTask;
}
}
接着添加幾個方法來開啟或關閉代理以及判斷代理是否存在和獲取代理信息:
{
_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;
}
最后在兩個按鈕的單擊事件代碼中加入如下內容:
{
StartPeriodicTask();
}
private void button2_Click( object sender, RoutedEventArgs e)
{
StopPeriodicTask();
}
至此還沒有完成,切記最后一步要把代理項目的引用加入到主程序中,如果不做這部不會有任何報錯,但是無法實現效果,需要注意:
這樣就完成了,我們運行一下看看,首先啟動程序:
點擊Start Agent后退回到主屏並找到設置中的后台任務:
這里顯示你的程序后台任務開啟,我們也可以點擊它進行關閉,過10秒鍾可以看到如下提示:
代碼成功,這段代碼的內容非常簡單,希望對大家有所幫助,謝謝!










