2011-07-11 72 views
0

假设我想在每30秒查询一次web API并提供任何更新的Android设备上创建一个服务(注意:小写 - 我不暗示android.app.Service)订阅的活动。我只希望有一项活动可以订阅这项服务。我应该在Android中实现简单的服务

  1. 创建一个完整的android.app.Service并将我的Activity绑定到该服务?或...
  2. 创建一个轻量级的“服务”(小写),它基本上是一个实现观察者模式的线程,并用新信息定期更新任何注册的观察者(应该只有一个观察者)。

网上的例子的网址也将不胜感激。

+2

不完全相关,但轮询可能会对您的电池寿命产生负面影响。您是否考虑过C2DM的通知? – jglouie

+0

@jglouie - 可能是相关的。对于第一次迭代,我将尽可能以最天真的方式实现我的(S | s)服务 - 但我可能会花时间在以后学习C2DM。 – JnBrymn

回答

1

不要期待你的活动活路

你的活动不应该启动一个线程,除了工作的短周期卸载。系统可能会一直暂停活动。因此,您可能不会依赖一项活动来继续运行。

这非常意味着一个线程是一个不行。还要注意Thread.sleep没有准确性。它可能会失火并且太早或太迟。看到android:java.lang.Thread.sleep documentation

Causes the thread which sent this message to sleep 
for the given interval of time (given in milliseconds). 
The precision is not guaranteed - the Thread may sleep 
more or less than requested. 

这两个事实几乎摧毁基于线程的想法。我强烈建议您查看Android服务基础架构。

+0

非常好的信息 - 你有任何关于* how *通过android.app.Service实现的进一步建议吗?我明白有几种选择,但我不知道选择哪一种。 IntentService?绑定服务? ... – JnBrymn

1

使用IntentService类/模式。在您的活动上创建一个onHandleIntent,您的android.app.Service实例也会回调,并且您都已设置。它的轻量级和Android将照顾大部分家务。

http://developer.android.com/reference/android/app/IntentService.html

+0

但我的理解是IntentService的客户端每次需要知道是否有更新时都必须启动服务。相反,如果新数据可用,我希望服务启动并以30秒为间隔通知客户端。 – JnBrymn

+0

好吧,你有一个鸡蛋 - 如果没有客户端接收服务答案,那有什么关系? –

0

我觉得一个AsyncTask可以做所有的工作适合你。您有一个doInBackgroud方法,您可以在其中查询API并发送过程消息,如果需要并在onPostExecute中更新。在那里你可以开始一个新的AsyncTask

+0

我是否正确,在每次返回AsyncTask时,我必须发出一个新的AsyncTask? – JnBrymn

+0

我会建议实现一个定时器来做到这一点 –

0

我回答了this关于过去服务的问题。您可以将AsyncTask绑定到服务中以处理网络查询