【问题标题】:Capturing IntentService Intents before onHandleIntent在 onHandleIntent 之前捕获 IntentService 意图
【发布时间】:2011-09-11 23:11:56
【问题描述】:

我有一个 IntentService,它可以对要进行的 Web 服务调用进行排队。我将一个整数作为 Extra 传递给每个 Intent,它定义了要进行的 Web 服务调用的类型。

我想创建一种情况,如果将执行特定 Web 服务的 Intent 传递给 IntentService,并且 IntentService 队列中已经存在同一 Web 服务的 Intent,则不会处理该 Intent。理想情况下,我会丢弃 Intent,但我也可以在其中添加一个 Extra,让代码知道在处理后跳过 Intent。当 Intent 进入时,我可以在添加到 IntentService 的某个对象中跟踪哪些在队列中。

但是,当 Intent 传递给 IntentService 时,我没有看到拦截 Intent 的地方。据我所知,我只能在调用 onHandleIntent 时触摸它,那为时已晚。

有什么想法吗?

【问题讨论】:

    标签: android intentservice


    【解决方案1】:

    严格来说,这不是可取的,但我建议这样:

    public int onStartCommand (Intent intent, int flags, int startId)
    {
      // do your intent modification here
      //if(intentIsDuplicate(intent))
    
      // make sure you call the super class to ensure everything performs as expected
      return super.onStartCommand(intent, flags, startId);
    }
    

    让我知道这是否有效。

    【讨论】:

    • 我在 IntentService 文档中看到了这个方法,但我不太确定它何时被调用。我还注意到它不能被覆盖。知道为什么吗?
    • 基本上内部onStartCommand 调用可能会处理排队:如果你覆盖它并确保你确实调用了超类的方法,你应该没问题。
    • 这似乎工作正常。我保留了一张地图,其中 Key 是一个整数,表示被调用的 Web 服务的类型,而 Value 是一个布尔值,表示该调用的 Intent 是否存在于队列中。在 onStartCommand 中,我查看传入的 Intent 是否用于队列中已经存在的呼叫。如果是这样,我会在其中添加一个名为“skip”的额外内容。在 onHandleIntent 中,我检查“跳过”并跳过任何代码(如果存在)。但在离开 onHandleIntent 之前,我更新了地图并将该键的值设置为 false。
    • 此外,如果 flags == 0,您可能应该只进行跳过检查。此外,在出现异常时将 onHandleIntent 代码包装在 try/catch 中可能是个好主意。不这样做可能会使您对那种类型的网络服务“卡住”。
    • 重要的是,您在重写的 onStartCommand 中编写的代码不会阻止调用超级方法。出于这个原因,我将我的代码包装在 try/catch 中。我的代码中有一个异常阻止调用超级方法。 Android 自动执行的后续重试然后导致应用程序崩溃,因为当 Intent 最初从未到达超级方法时,调用超级方法将重试标志无法正常工作。
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多