现在我在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应该是相同的,不是吗?上下文没有变化,附加内容也是一样的。
答案 0 :(得分:7)
有一种方法可以专门比较意图 - filterEquals():http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent)
使用此方法时,看起来具有相同数据,类别和操作的意图将被视为相等。
答案 1 :(得分:5)
您需要定义自己的equals
方法,以满足您的平等标准,无论它们是什么。
根据Intent
API docs,equals
方法由Object
定义 - 简单身份。
这或多或少是标准的Java基础;看看这个类是否定义了它自己的相等性,如果没有,你需要自己创建 - 需要注意的是,实例所在的任何环境都可能也检查相等性,所以实现它是值得的equals
和hashCode
正确。
(如果您定义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并比较结果字符串。仅当它们具有相同的动作,类别,类型,标志,包,组件和附加内容时,它们才是平等的。