向 IntentService 询问有关其队列的信息

Posted

技术标签:

【中文标题】向 IntentService 询问有关其队列的信息【英文标题】:Asking an IntentService for information about its queue 【发布时间】:2011-07-18 10:32:54 【问题描述】:

我有一个 IntentService,它将需要对我的 Web 服务器进行的 Web 服务调用排队。因此,每个 Intent 都是要进行的 Web 服务调用。

我想设置一些东西,我的应用程序可以询问这个 IntentService 是否有任何包含特定数据的 Intent(IE:“您是否已经在等待向云请求 x 数据?或者我需要告诉你做吗?”)。

对于如何扩展 IntentService 来做到这一点,有什么建议吗? IntentService的Intent队列可以遍历吗?还是我需要获取 IntentService 代码并对其进行更改?

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

【问题讨论】:

【参考方案1】:

对于如何扩展 IntentService 来做到这一点,有什么建议吗? IntentService的Intent队列可以遍历吗?还是我需要获取 IntentService 代码并对其进行更改?

如果您真的想检查实际队列,可能是后者。 IntentServiceIntents 转换为通过HandlerThread 弹出到Looper 的消息队列中的消息。但是,这些都没有通过 SDK 公开。幸运的是,IntentService 相当短——甚至不到 150 行。您可以将其克隆到您自己的包中并根据需要进行修改。只需在 AOSP 存储库中发布新的源更新时对源运行 diff,这样您就知道 Google 是否对 IntentService 本身进行了任何您可能想要利用的重大手术。

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

它甚至不需要像那样持久化,因为IntentService 自己的队列不是持久化的。只需在onStartCommand() 中维护您自己的FIFO 队列,链接到超类,并在onHandleIntent() 末尾将您的Intent 从队列中弹出。这有可能与主队列不同步(例如,您需要使用finally 来确保将工作从您自己的队列中弹出),但您不必克隆该类。

【讨论】:

很棒的帖子。我想我现在有一些好主意要探索。谢谢你:) 非常感谢您的这篇文章。如果 Intent 已经在队列中,我实现了这个类的一个版本来阻止它运行,但如果需要 gist.github.com/2898452 可以很容易地对其进行调整 感谢工作代码。我所做的唯一补充是添加一个使用 filterEquals 的默认 isEqual 方法,然后允许我覆盖它,以便我可以将过去的一些 Extras 与意图进行比较,因为我所有意图的操作都是相同的。哦,我还称我的版本为 UniqueIntentService :)【参考方案2】:

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

Here 是一个平稳的解决方案,我从中找到了类似问题的灵感:)

【讨论】:

但是当我仔细观察时,我意识到你也发布了这个问题:)

以上是关于向 IntentService 询问有关其队列的信息的主要内容,如果未能解决你的问题,请参考以下文章

向 requestLocationUpdates intentService 发送额外信息会中断位置更新

IntentService - 查找队列中等待的 Intent 数量

Android:intentservice,如何中止或跳过handleintent队列中的任务

IntentService与Service的区别

android 中IntentService的使用场景

向 NSBundle 询问其资源名称