如何比较两个Intent的相等性

Sea*_*eil 1 java android android-intent

现在我有一个LinkedListIntent,IntentService它可以跟踪Intents入队的内容Service.我发现contains()即使对于相同的Intent ,该方法也永远不会返回true.还有什么我需要做的比较两个意图吗?

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if(queue.contains(intent)){
                    //Never reaches here
        intent.setAction(NO_ACTION);
    }
    queue.push(intent);
    return super.onStartCommand(intent, flags, startId);
}
Run Code Online (Sandbox Code Playgroud)

发送Intent的示例代码:

    Intent i = new Intent(context, NodeIndexService.class);
    i.setAction(NodeIndexService.REFRESH);
    i.putExtra(NodeIndexService.TYPE, indexType);
    i.putExtra(NodeIndexService.RESULT_RECEIVER, receiver);
    context.startService(i);
Run Code Online (Sandbox Code Playgroud)

使用此代码一个接一个地发送的两个Intent应该是相同的,不是吗?上下文没有变化,附加内容也是一样的.

bar*_*rry 7

有一种方法可以专门比较意图 - filterEquals():http://developer.android.com/reference/android/content/Intent.html#filterEquals (android.content.Intent )

使用此方法时,看起来具有相同数据,类别和操作的意图将被视为相等.

  • @oneilse很好,但这不是您在评论中说的-比较多个字段,特别是*不*比较您设置的额外数据,并说您因此担心自定义等于。 (2认同)

Dav*_*ton 5

您需要定义自己的equals方法以满足您的平等标准,无论它们是什么.

根据IntentAPI文档,equals方法由Object--simple identity 定义.

这或多或少是标准的Java基础; 看看这个类是否定义了它自己的相等性,如果没有,你需要创建自己的等式 - 需要注意的是,实例所处的环境也可以检查相等性,因此实现equalshashCode 正确实现是值得的.

(如果您定义了一个equals,则需要定义hashCode完整性.)


您的代码专门创建了新的意图 - 这就是做什么new.

您正在创建两个对象:对象标识意味着查看两个引用是否引用完全相同的对象,而不是任意属性是否相同.如果要根据任意条件进行比较,则需要定义自己的equals方法来执行您关心的比较.

  • @ oneilse14因为它们不是同一个实例 - 这就是对象标识的含义. (2认同)