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

44

我想定期运行一些任务(例如获取我的网站新闻页面),即使我的应用程序关闭了。这是否可能?

3个回答

49

是的,你需要查看AlarmManager来设置重复的“Alarm”。这对设备的电池寿命更好,因为与服务不同,它不会在后台持续运行。 Alarm触发广播接收器,该接收器将执行您的自定义代码。

最后一点 - 有用于定时Alarm的枚举值,包括每天,半天等等,尽管您可以设置实际值。

在以下SO帖子中可以找到一个很好的例子:

Alarm Manager Example

更新

Android添加了新功能。如果您正在阅读本文,则建议您现在查看GcmNetworkManager。这优化了电池寿命,并可用于Lollipop之前。从Lollipop开始,您可以使用JobScheduler。我建议使用这些类而不是AlarmManager。


你写的吗?只是出于兴趣问一下,@Graham Smith。 - Jake Graham Arnold
@Graham Smith 您提供的链接已经失效了。您能提供一个有效的链接吗? - Zapnologica
@Zapnologica,现在SO上有一个很好的例子-我发布时链接有效。希望这可以帮到你。 - Graham Smith
1
我认为现在这个任务最合适的工具是转向GcmNetworkManager - surlac

13
我认为最合适的选择是GcmNetworkManager。它基本上拥有AlarmManager所需的一切,还具有持久性,因此作业可以在重启后继续执行。
示例:
PeriodicTask task = new PeriodicTask.Builder()
        .setService(MyTaskService.class)
        .setTag(TASK_TAG_PERIODIC)
        .setPeriod(5L)
        .build();

mGcmNetworkManager.schedule(task);

1
你是对的 - 这可能会成为以后做这件事情的常规方式。我在2.5年前写了我的答案,事物不断变化。我认为你需要加入有关Lollipop Job Scheduler的内容,因为你不一定需要使用GcmNetworkManager。顺便说一下,我已经点赞了。 - Graham Smith

11

作为替代方案,我正在比较本周:

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
}

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


但是这段代码实际上在哪里?因为此时应用程序已关闭(未运行)。 - Adam Burley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接