I have 2 android intent objects that can be persisted as URLs and then rehydrated back into intent objects. I'm wondering what is the most effective way to compare any 2 intent objects to ensure that they end up resolving to the same activity with the same parameters etc. Using intent.filterEquals
does this, but it does not include the extras.
Currently my code for the equals
method looks like this:
Intent a = Intent.parseUri(this.intentUrl,
Intent.URI_INTENT_SCHEME);
Intent b = Intent.parseUri(other.intentUrl,
Intent.URI_INTENT_SCHEME);
if (a.filterEquals(b)) {
if (a.getExtras() != null && b.getExtras() != null) {
for (String key : a.getExtras().keySet()) {
if (!b.getExtras().containsKey(key)) {
return false;
} else if (!a.getExtras().get(key)
.equals(b.getExtras().get(key))) {
return false;
}
}
}
// all of the extras are the same so return true
return true;
} else { return false; }
But is there a better/cleaner way?
This is pretty much an implementation of what CommonsWare suggested combined with Ben's code but also covers the case where either
a
has extras andb
does not orb
has extras anda
does not.Improving upon @aostiles' answer by adding the missing return statement and also conditions to compare arrays in extras:
That's probably as good as it gets, at least conceptually. However, I don't think your algorithm covers cases where
b
has a key thata
does not.I'd get both
keySet()
values and run anequals()
on those, to confirm they both have the same keys. Then, iterate over one and runequals()
on the value pair.