运行任务周期性(每天一次/每周一次)

问题描述:

即使我的应用程序已关闭,我也想定期(即每周/每天一次)运行某个任务(即获取我的网站新闻页面)。可能吗?运行任务周期性(每天一次/每周一次)

是的,你需要看看AlarmManager设置一个重复出现的“报警”。这对于设备上的电池寿命会更好,因为它不像服务一样在后台不断运行。警报触发broadcast receiver这将执行您的自定义代码。

作为最后一点 - 有报警时间的枚举值,包括每日,每日半和更多,尽管您可以设置一个实际值。

一个很好的例子可以在后续的SO后发现:

Alarm Manager Example

更新

较新的功能已被添加到Android。如果您正在阅读本文,我会建议您现在查看GcmNetworkManager。这优化了电池的使用寿命并运行棒棒糖。对于棒棒糖,您可以使用JobScheduler。我建议通过AlarmManager使用这些类。

+0

感谢,这正是我一直在寻找。 – siemian 2011-12-23 11:45:02

+0

@格拉汉姆史密斯出于兴趣,你写了你自己的? – 2013-04-30 08:04:20

+0

@Graham Smith 您提供的链接已损坏。你能提供一个工作链接吗? – Zapnologica 2013-10-07 21:45:40

作为替代方案,我比较当前周:

Calendar cal = Calendar.getInstance(); 
int currentWeekOfYear = cal.get(Calendar.WEEK_OF_YEAR); 

SharedPreferences sharedPreferences= this.getSharedPreferences("appInfo", 0); 
int weekOfYear = sharedPreferences.getInt("weekOfYear", 0); 

if(weekOfYear != currentWeekOfYear){ 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putInt("weekOfYear", currentWeekOfYear); 
    editor.commit(); 
    // Your once a week code here 
} 

我不主张,这是比报警更好的解决方案。我只是展示了一种不同的方法。

我认为最合适的是GcmNetworkManager。基本上它具有AlarmManager加持久性所需的一切功能,因此可以在重新启动后继续执行作业。

例子:

PeriodicTask task = new PeriodicTask.Builder() 
     .setService(MyTaskService.class) 
     .setTag(TASK_TAG_PERIODIC) 
     .setPeriod(5L) 
     .build(); 

mGcmNetworkManager.schedule(task); 
+1

你是对的 - 这可能会成为这样做的正常方式。我在两年前写了我的回答,所以事情继续下去。我认为你需要添加关于Android 5+的棒棒糖Job Scheduler,因为你不需要使用'GcmNetworkManager'。我upvoted顺便说一句。 – 2016-02-29 22:41:58