2010-01-14 56 views
6

似乎有两种方法可以执行后台任务。我的用例是让我的应用程序每隔x分钟读取一次数据馈送,而不管我的gui是否正在运行,而不管手机是否正在睡眠。如何安排后台任务

我使用alarmmanager安排意图相匹配的广播接收器。在onRecieve方法中,我启动一个服务(startService),该服务产生一个AsyncTask。任务提取数据并存储它,然后stopSelf()服务。

在onRecieve方法我AQUIRE一个PARTIAL_WAKE_LOCK

,启动服务之前,只是在服务调用stopSelf()之前,我再次释放。

这真的是最好的方法吗?我甚至需要在这种情况下的服务?

我遇到这种设置,其中设置适用于小时,然后突然停止,这使得它很难调试奇怪的行为。

有没有人有一个简单的万无一失的方法,才达到同样的目的?

回答

5

我使用警报管理器安排与广播接收器匹配的 意图。 在onRecieve方法中,我启动了一个 服务(startService),该服务产生了一个AsyncTask 。该任务获取数据 并存储它,然后stopSelf() 服务。

我建议使用IntentService代替AsyncTask/stopSelf()模式,但除此之外,这似乎声音。

在onRecieve方法

我AQUIRE一个 PARTIAL_WAKE_LOCK,启动 服务之前,只是调用 stopSelf()在服务之前,我再次释放 它。

这很有道理。我在我的WakefulIntentService开源组件中做了很多相同的事情。

这真的是做到这一点的最好方法是什么?

你肯定似乎接近。

我是否甚至需要在此 情况下的服务?

如果您需要按计划完成的工作只需要一秒左右,您可以在BroadcastReceiver中完成。否则,您需要在后台线程上完成该工作,并且BroadcastReceivers不能分叉后台线程。

+0

aha!所以我无法在播放器中启动我的asynctask?即使我在onrecieve中获得了wakelock,并在asynctask完成时释放它? 感谢您提供的信息,我想我需要为我的闹钟提供更多的帮助 – Wilken 2010-01-14 15:23:29

+0

“所以我无法在播放器中启动我的asynctask?”我不这么认为,但我还没有尝试过。AsyncTask拥有自己的线程池,它可能*可以安全地从BroadcastReceiver运行AsyncTask。 – CommonsWare 2010-01-14 16:01:34

+0

感谢使用IntentService的想法,不知道这一点。现在我已经放弃了我的服务和AsyncTask。更优雅。 – Wilken 2010-01-14 18:15:57