博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Windows Phone] 为应用添加后台计划任务 – Scheduled Task Agent
阅读量:6717 次
发布时间:2019-06-25

本文共 3071 字,大约阅读时间需要 10 分钟。

前段时间做过一个天气应用,一直是只支持前台获取数据,上周末参加了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秒钟可以看到如下提示:

代码成功,这段代码的内容非常简单,希望对大家有所帮助,谢谢!

转载地址:http://arkmo.baihongyu.com/

你可能感兴趣的文章
gradle web 项目基础
查看>>
LPC2000 液晶显示器HDG12864L-6串行控制
查看>>
谷歌让ITC禁止每一个Mac,iPad和大部分iPhone
查看>>
VS2010查找历史记录清除
查看>>
Java细枝末节
查看>>
Windows UDP socket recvfrom返回10054错误的解决办法
查看>>
lucene学习6-各种查询
查看>>
Applying decision trees
查看>>
疯狂Spring Cloud连载(14)Spring Cloud整合Feign
查看>>
assert用于PHP的debug
查看>>
基于TF-IDF算法抽取文章关键词
查看>>
ELK搭建-基于自制docker镜像
查看>>
字符编码笔记:ASCII,Unicode和UTF-8
查看>>
Oracle中表的四种连接方式讲解
查看>>
linux系统中readline的实现
查看>>
Linux下的ping命令
查看>>
JAVA使用JDOM创建简单xml
查看>>
mac 上安装 Android SDK
查看>>
angular 1.x select 默认选中
查看>>
input accept属性限制文件上传格式
查看>>