在处理 onHandleIntent 之前捕获 IntentService 意图

6
我有一个IntentService将Web服务调用排队以便执行。每个Intent都会传递一个整数作为Extra,它定义了要进行的Web服务调用类型。
我想创建这样一种情况:如果向IntentService传递执行特定Web服务的Intent,并且该Intentservice队列中已经存在该相同Web服务的Intent,则不处理该Intent。理想情况下,我会丢弃该Intent,但我也可以给它添加一个Extra,让代码知道在处理该Intent后跳过它。随着Intents的到来,我可以在IntentService中添加某些对象来跟踪现有队列。
但是,我没有找到在Intent传递给IntentService时立即拦截该Intent的位置。据我所知,在onHandleIntent被调用时才能操作该Intent,而那时已经太晚了。
有任何想法吗?
1个回答

5

严格来说不太建议,但我建议这样做:

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文档中看到了这个方法,但我不太确定它何时被调用。我还注意到它不应该被覆盖。有什么想法为什么? - Andrew
基本上,内部的onStartCommand调用可能处理队列:如果你重写它并确保实际调用了超类的方法,应该没问题。 - Femi
这似乎是正常工作的。我保留了一个映射,其中Key是代表被调用的Web服务类型的整数,Value是代表队列中是否存在该调用Intent的布尔值。在onStartCommand中,我检查传入的Intent是否为队列中已存在的调用。如果是,则我添加额外的"skip"到其中。在onHandleIntent中,我检查是否有"skip"并跳过任何代码(如果存在)。但在离开onHandleIntent之前,我更新映射并将该Key的Value设置为false。 - Andrew
此外,如果标记为0,您应该仅执行跳过检查。另外,建议在onHandleIntent代码中添加try/catch块以防异常。否则可能会导致该类型网络服务的标志“挂起”。 - Andrew
1
重要的是,在覆盖 onStartCommand 方法时,你所编写的代码不能阻止调用 super 方法。因此,我将我的代码包装在 try/catch 中。我曾经遇到过一个异常,它阻止了 super 方法的调用。随后由 Android 自动执行的重试会导致应用程序崩溃,因为当 Intent 从未最初到达 super 方法时,调用 super 方法将重试标志不起作用。 - Andrew

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