1

现在我有一个LinkedListIntents 来IntentService跟踪Service. 我发现该contains()方法永远不会返回 true,即使对于相同的 Intent。我还需要做些什么来比较两个 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 的示例代码:

    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 应该是相同的,不是吗?上下文没有改变,额外的东西也是一样的。

4

5 回答 5

8

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

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

于 2012-06-08T22:54:42.547 回答
5

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

根据IntentAPI 文档,该equals方法由Object--simple 身份定义。

这或多或少是标准的 Java 基础;查看该类是否定义了自己的相等性,如果没有,则需要创建自己的 - 需要注意的是,无论实例所在的环境也可能检查相等性,因此实现equalshashCode 正确是值得的。

(如果你定义一个equals,你会想要定义一个hashCode完整性。)


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

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

于 2012-06-08T20:08:47.217 回答
1

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

于 2019-01-17T22:30:04.857 回答
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()))
于 2012-06-08T19:56:51.517 回答
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;
    }
}
于 2014-08-17T20:45:17.347 回答