2012-06-08 60 views
1

现在我在IntentService中有意向,它跟踪Service对intents的排队情况。我发现方法永远不会恢复正常,即使对于相同的意图。还有什么我需要做比较两个意图?如何比较两个意图是否相等

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

两个目的被发送一个接一个地与此代码应该是相同的,没有?上下文没有改变,额外功能也是一样的。

+0

你所说的“相同”的意图是什么意思?你需要定义它们意味着它们是平等的,否则它只会做对象身份。 –

+1

“相同”意味着相同的动作,类型和附加。我假定如果两个intent被释放,并且这些参数在各自的Intent上相等,equals()将返回true。 – SeanPONeil

回答

5

您需要定义自己的equals方法,以满足您的平等条件,不管他们可能。

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

这或多或少是标准的Java基础;看看这个类是否定义了它自己的平等,如果不是,你需要创建你自己的 - 要注意的是,无论环境的实例在哪里可能检查是否相等,所以支付实现equalshashCode正确

(如果定义了equals,你要定义一个完整hashCode


您的代码专门创造了新的意图 - 这就是new一样。

你创建两个对象:对象的身份意味着眼看两个引用是否指的是完全相同的对象,不若任意性能是相同的。如果您想根据任意标准进行比较,则需要定义您自己的equals方法,以进行您关心的比较。

+0

我想一个更好的问题将是为什么当我使用equals()方法时,我的Intents不会返回true。如果我不更改操作,类型,附加功能或上下文,为什么它们不相等? – SeanPONeil

+2

@ oneilse14因为它们不是同一个实例 - 这就是对象标识的含义。 –

+0

等于()比较身份。有没有办法比较对象的相等性,即使它们不是同一个实例? – SeanPONeil

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())) 
+1

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/AbstractCollection.java#AbstractCollection.contains%28java.lang.Object%29 – SeanPONeil

+0

这就是如果没有提供比较器,则包含什么。 –

+0

contains()方法正在完成这个 – SeanPONeil

6

有一个具体比较意图的方式 - filterEquals():http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent

它看起来像使用相同的数据,类别和行动意图将使用此方法时被认为是相等的。

+0

正是我在找什么,谢谢。 – SeanPONeil

+1

@oneilse好,但这不是你在评论中所说的 - 这比较了更多的领域,特别是*并不*比较额外的数据,你设定的,并说你关心 - 因此是一个自定义平等。 –

+0

啊好点。我会接受你的回答 – SeanPONeil

-1

在这里,我比较使用比较两个目的(使用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; 
    } 
} 
相关问题