向IntentService查询其队列信息

10

我有一个IntentService,它将需要发送到我的web服务器的web服务调用排队。所以每个Intent都是要进行的web服务调用。

我希望设置一种方式,让我的应用程序询问该IntentService是否有包含特定数据的Intents(例如:“您已经在等待请求云端的x数据吗?还是需要告诉您去执行它?”)

有关如何扩展IntentService以完成此操作的建议吗?可以遍历IntentService的Intent队列吗?还是需要修改IntentService代码?

我唯一想到的另一个方法是向数据库添加一个表,并记录在队列中的每个调用,每个日志完成时从表中删除。

2个回答

22
有没有关于如何扩展 IntentService 来完成这个任务的建议?能遍历 IntentService 的 Intent 队列吗?还是需要获取 IntentService 代码并进行修改?
后者可能更好,如果你真的想要检查实际的队列。IntentService 通过 HandlerThread 将 Intents 转换为在 Looper 的消息队列中弹出的消息。虽然这些都没有通过 SDK 公开,但幸运的是,IntentService 相当简短 - 连150行都不到。您可以将其克隆到自己的包中,并根据需要进行修改。只需在发布新的源更新时运行 diff 命令,以便您知道是否要利用 Google 在 IntentService 自身上执行的任何重大手术。
我唯一的另一个想法是向数据库添加表并记录队列中的调用,每个日志完成后从表中删除。
不需要像那样持久存在,因为 IntentService 自己的队列不是持久的。只需在 onStartCommand() 中维护自己的 FIFO 队列,链接到超类,并在 onHandleIntent() 结束时弹出您的 Intent 即可。这有可能与主队列失步(例如,您将使用 finally 确保从自己的队列中弹出工作),但您不必克隆该类。

很棒的帖子。我觉得现在有一些好的想法可以探索了。谢谢 :) - Andrew
1
非常感谢您的帖子。我实现了一个阻止Intent在队列中运行的版本,但如果需要,它可以轻松地进行调整。https://gist.github.com/2898452 - SeanPONeil
1
感谢提供可运行的代码。我只添加了一个默认的isEqual方法,它使用filterEquals方法,这使得我可以重写它以便于比较一些传递到意图中的附加项,因为所有我的意图的操作都是相同的。哦,我还将我的版本称为UniqueIntentService :) - guyland123

1

另一个解决方案可能是通过覆盖 onStartCommand 来解决它。

这里有一个顺畅的解决方案,我从中为类似的问题找到了灵感 :)


但是当我仔细看的时候,我意识到你也发了那个问题 :) - johan

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