1

現在、によってキューに入れられたLinkedListインテントIntentServiceを追跡する にインテントの がありServiceます。同じインテントであっても、contains()メソッドが決して true を返さないことがわかりました。2 つのインテントを比較するために他に何かしなければならないことはありますか?

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

このコードで次々に送信される 2 つのインテントは同一であるはずですよね? 文脈は変わらず、おまけも同じです。

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 docsによると、equalsメソッドはObject--simple identity によって定義されています。

これは多かれ少なかれ標準的な Java の基礎です。クラスが独自の同等性を定義しているかどうかを確認します。そうでない場合は、独自のものを作成する必要があります。ただし、インスタンスが存在する環境が何であれ、同等性チェックする可能性があるためequalshashCode 正しく実装する必要があります。

( を定義する場合は、完全equalsを期すために を定義する必要がありますhashCode。)


あなたのコードは明確に新しいインテントを作成します - それが何をするかnewです。

2 つのオブジェクトを作成しています。オブジェクト ID とは、任意のプロパティが同じかどうかではなく、2 つの参照がまったく同じ objectを参照しているかどうかを確認することを意味します。任意の基準に基づいて比較したい場合は、関心のある比較を行う独自のメソッドを定義する必要があります。equals

于 2012-06-08T20:08:47.217 に答える
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

ここでは、コンパレーターを使用して 2 つのインテントを比較します (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 に答える