【发布时间】:2012-01-26 18:47:57
【问题描述】:
我想定期(每周/每天一次)运行一些任务(即获取我的网站新闻页面),即使我的应用程序已关闭。可能吗?
【问题讨论】:
我想定期(每周/每天一次)运行一些任务(即获取我的网站新闻页面),即使我的应用程序已关闭。可能吗?
【问题讨论】:
是的,您需要查看AlarmManager 来设置重复发生的“警报”。这对设备的电池寿命更好,因为它不像服务那样在后台持续运行。警报触发broadcast receiver,它将执行您的自定义代码。
最后一点 - 警报时间有枚举值,包括每天、每天半天等等,尽管您可以设置一个实际值。
可以在下面的 SO 帖子中找到一个很好的例子:
更新
Android 中添加了新功能。如果您正在阅读本文,那么我建议您现在查看GcmNetworkManager。这可以优化电池寿命并在棒棒糖之前工作。对于 Lollipop,您可以使用 JobScheduler。我建议在 AlarmManager 上使用这些类。
【讨论】:
我认为最合适的是GcmNetworkManager。基本上它拥有您从 AlarmManager 和持久性所需的一切,因此作业可以在重新启动后继续执行。
例子:
PeriodicTask task = new PeriodicTask.Builder()
.setService(MyTaskService.class)
.setTag(TASK_TAG_PERIODIC)
.setPeriod(5L)
.build();
mGcmNetworkManager.schedule(task);
【讨论】:
GcmNetworkManager。顺便说一句,我投了赞成票。
作为替代方案,我正在比较本周:
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
}
我并不是主张这比警报解决方案更好。我只是展示了一种不同的方法。
【讨论】: