comparing android intent objects

2019-07-22 01:13发布

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?

3条回答
我命由我不由天
2楼-- · 2019-07-22 01:56

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 and b does not or b has extras and a does not.

private boolean areEqual(Intent a, Intent b) {
    if (a.filterEquals(b)) {
        if (a.getExtras() != null && b.getExtras() != null) {
            // check if the keysets are the same size
            if (a.getExtras().keySet().size() != b.getExtras().keySet().size()) return false;
            // compare all of a's extras to b
            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;
                }
            }
            // compare all of b's extras to a
            for (String key : b.getExtras().keySet()) {
                if (!a.getExtras().containsKey(key)) {
                    return false;
                } else if (!b.getExtras().get(key).equals(a.getExtras().get(key))) {
                    return false;
                }
            }
        }
        if (a.getExtras() == null && b.getExtras() == null) return true;
        // either a has extras and b doesn't or b has extras and a doesn't
        return false;
    } else {
        return false;
    }
}
查看更多
唯我独甜
3楼-- · 2019-07-22 01:58

Improving upon @aostiles' answer by adding the missing return statement and also conditions to compare arrays in extras:

private boolean intentsAreEqual (Intent a, Intent b)
    {
        if (a.filterEquals(b)) {
            if (a.getExtras() != null && b.getExtras() != null) {
                // check if the keysets are the same size
                if (a.getExtras().keySet().size() != b.getExtras().keySet().size()) return false;
                // compare all of a's extras to b
                for (String key : a.getExtras().keySet()) {
                    if (!b.getExtras().containsKey(key)) {
                        return false;
                    }
                    else if (a.getExtras().get(key).getClass().isArray() && b.getExtras().get(key).getClass().isArray()) {
                        if (!Arrays.equals((Object[]) a.getExtras().get(key), (Object[]) b.getExtras().get(key))) {
                            return false;
                        }
                    }
                    else if (!a.getExtras().get(key).equals(b.getExtras().get(key))) {
                        return false;
                    }
                }
                // compare all of b's extras to a
                for (String key : b.getExtras().keySet()) {
                    if (!a.getExtras().containsKey(key)) {
                        return false;
                    }
                    else if (b.getExtras().get(key).getClass().isArray() && a.getExtras().get(key).getClass().isArray()) {
                        if (!Arrays.equals((Object[]) b.getExtras().get(key), (Object[]) a.getExtras().get(key))) {
                            return false;
                        }
                    }
                    else if (!b.getExtras().get(key).equals(a.getExtras().get(key))) {
                        return false;
                    }
                }
                return true;
            }
            if (a.getExtras() == null && b.getExtras() == null)
            {
                return true;
            }
            // either a has extras and b doesn't or b has extras and a doesn't
            return false;
        }
        else
        {
            return false;
        }
    }
查看更多
Summer. ? 凉城
4楼-- · 2019-07-22 02:02

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 that a does not.

I'd get both keySet() values and run an equals() on those, to confirm they both have the same keys. Then, iterate over one and run equals() on the value pair.

查看更多
登录 后发表回答