【问题标题】:Android How to queue multiple intents on an IntentServiceAndroid 如何在 IntentService 上排队多个意图
【发布时间】:2013-02-12 13:22:22
【问题描述】:

我对 IntentService 的使用有点困惑。

  1. 文档说 IntentService 将发送给它的所有意图排队并一次处理一个。
  2. 我查看了code of IntentService,发现 onStartCommand() 接收到意图,调用 onStart() 将其作为消息发送给意图排队

我很确定我在文档中读到过 onStartCommand() 只被系统调用一次,如果你发出两次 startService(),第二次调用不会导致 onStartCommand() 被调用。
我在这里可能错了,因为我一直在寻找这篇文档,但似乎找不到。
这与之前的概念相矛盾,即您可以通过 onStartCommand() 在 IntentService 中排队许多意图。

所以我需要帮助,如何在 IntentService 上排队多个意图?

我只看到两个选项:

  • 只需每次调用​​ startService() 以不同的意图

  • 直接调用onStart()onStartCommand()(绕过startService()

【问题讨论】:

    标签: android service intentservice


    【解决方案1】:

    您将IntentContext.startService() 一起发送,然后您的服务在onHandleIntent() 中获取Intent。

    第一次调用startService() 将导致服务的onStartCommand() 被调用。把它想象成一个构造函数。对startService() 的后续调用不需要再次启动该服务,因为它已经在运行;它们只会导致对服务的onHandleIntent() 的更多调用。

    【讨论】:

    • 根据IntentService的代码(见我问题中的链接)你会看到直接调用onHandleIntent()是不可能的,只有消息Handler可以做到。系统必须调用 onStart() 或 onStartCommand()。
    • 是的,没错。您需要做的就是调用startService(),并在服务内部实现onHandleIntent()。系统会为您完成所有其他工作,包括决定实际启动服务的方式和时间。
    • 旁注:这是否意味着我可以通过覆盖onStart()来拦截意图排队? (我知道这听起来很糟糕,因为 onStart() 已被弃用为 API,但原则上?)
    • @ilomambo 我认为 onStartCommand 每次调用 startService 时都会运行(只需调试代码,你就会知道:))我只想知道意图是否由它存储,因为我得到了当我排队一些意图服务时出现一些空指针异常
    • @berserk 我遇到了同样的问题,即为下一次 Intent 服务调用获取 NullPointerException,我只是从我的 IntentService 中删除了 onStartCommand 覆盖方法并解决了。我在 ilomambo question 中检查了上面提到的 IntentService 类的代码,并在 onStartCommand 的方法注释中找到了提示,您不应该覆盖此方法。不知道你可以试试。
    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多