1

Android のドキュメントには次のように書かれています。

http://developer.android.com/reference/android/content/IntentFilter.html

「指定された値のいずれかが意図アクションと一致する場合、またはフィルターでアクションが指定されていない場合、アクションは一致します。」

私はそれをテストしようとしました。私のテスト アプリケーションでは、アクティビティの 1 つにそのようなフィルターを設定しました。

<intent-filter>
    <action android:name="ma" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="mk1" />
</intent-filter>

私はそのような意図を送ろうとします:

Intent i = new Intent();
i.setAction("ma");
i.addCategory("mk1");
startActivity(i);

動作します - 私のアクティビティが開始されます。

次に、フィルターのアクションをコメントアウトします。

<intent-filter>
    <!-- <action android:name="ma" /> -->
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="mk1" />
</intent-filter>

もう一度、まったく同じ意図を送信します。今、私の活動は始まりません。

なんで?ドキュメントによると、フィルターにアクションが指定されていない場合、いくつかのアクションの意図はそれを満たす必要があります。

4

2 に答える 2

2

IntentFilters のドキュメント、特にIntent Resolutionのセクションにあるアクション テストの次の説明を参照してください。

例が示すように、Intent オブジェクトは 1 つのアクションのみを指定しますが、フィルターは複数のアクションをリストする場合があります。リストを空にすることはできません。フィルターには少なくとも 1 つの要素が含まれている必要があります。含まれていない場合、すべてのインテントがブロックされます。

このテストに合格するには、Intent オブジェクトで指定されたアクションが、フィルターにリストされたアクションの 1 つと一致する必要があります。オブジェクトまたはフィルタでアクションが指定されていない場合、結果は次のようになります。

  • フィルターがアクションのリストに失敗した場合、一致するインテントがないため、すべてのインテントがテストに失敗します。インテントはフィルターを通過できません。

  • 一方、アクションを指定しない Intent オブジェクトは、フィルターに少なくとも 1 つのアクションが含まれている限り、自動的にテストに合格します。

このことから、アクションIntentFilterを含まない がどのオブジェクトとも一致しないことは明らかです。これはあなたが見ているものです。 Intent


一方で、ドキュメンテーションに一貫性がないことには完全に同意します。ここにコピーしたセクションでさえ、「フィルターには少なくとも 1 つの要素が含まれている必要があります。そうしないと、すべてのインテントがブロックされます」「アクションを指定しない Intent オブジェクトは自動的にテストに合格します。フィルタには少なくとも 1 つのアクションが含まれているためです。」

于 2013-07-18T13:35:44.643 に答える