如何比较两个Intent的相等性

时间:2012-06-08 19:32:24

标签: java android android-intent

现在我在LinkedList中有一个IntentService个Intents,可以跟踪Service排队的Intents。我发现contains()方法永远不会返回true,即使对于相同的Intent也是如此。还有什么我需要做的比较两个意图吗?

@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);
}

发送意图的示例代码:

    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);

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

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

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

根据Intent API docsequals方法由Object定义 - 简单身份。

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

(如果您定义equals,则需要为完整性定义hashCode


您的代码专门创建了新的意图 - 这就是new所做的。

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

答案 2 :(得分:0)

你可以这样做吗?

Object ob1 = (Object) intent1;
Object ob2 = (Object) intent2;

if(ob1.equals(ob2))

如果关于它们的所有内容相同,上述内容才会成立

您想要比较意图的具体部分吗?


    if(intent1.getAction().equals(intent2.getAction()) && intent1.getType().equals(intent2.getType()) &&
    intent1.getExtras().equals(intent2.getExtras()))

答案 3 :(得分:0)

这里我使用比较器比较两个意图(在使用FEST的单元测试中):

import static org.fest.assertions.api.Assertions.assertThat;

assertThat(intentOne).usingComparator(new IntentComparator()).isEqualTo(intentTwo);

private static class IntentComparator implements Comparator<Intent> {
    @Override
    public int compare(Intent left, Intent right) {
        return left.filterEquals(right) ? 0 : 1;
    }
}

答案 4 :(得分:0)

您可以使用Intent.toUri(0)将意图转换为URI并比较结果字符串。仅当它们具有相同的动作,类别,类型,标志,包,组件和附加内容时,它们才是平等的。