Skip to content

Most visited

Recently visited

navigation

インテントとインテント フィルタ

Intent は、他のアプリ コンポーネントからのアクションを要求するときに使用するメッセージング オブジェクトです。インテントを使用することでコンポーネント間の通信を促進する方法はいくつかありますが、基本的な使用例は次の 3 つです。

インテントのタイプ

インテントには 2 つのタイプがあります。

暗黙的インテントを使用してアクティビティやサービスを開始する際、システムによってただちに Intent オブジェクトで指定されたアプリ コンポーネントが開始されます。

図 1 暗黙的インテントが他のアクティビティを開始するようシステム内に配信される仕組みを表しています。[1] Activity A がアクションの記述を使って Intent を作成し、それを startActivity() に渡します。[2] Android システムがすべてのアプリに対してインテントに一致するインテント フィルタを検索します。 一致するものが見つかったら、[3] システムが onCreate() メソッドを呼び出して、Intent に渡すことで、そのアクティビティ(Activity B)を開始します。

暗黙的インテントを作成するとき、Android システムはインテントの内容を、端末上の他のアプリの マニフェスト ファイルで定義された インテント フィルタ と比較して、開始すべきコンポーネントを見つけます。 インテントがインテント フィルタに一致した場合、システムがそのコンポーネントを開始して、Intent を配信します。 複数のインテント フィルタが競合する場合、ユーザーが仕様するアプリを選択できるようシステムによってダイアログが表示されます。

インテント フィルタは、コンポーネントが受け取りたいインテントのタイプを指定する式で、アプリのマニフェスト ファイルに含まれています。 たとえば、アクティビティのインテント フィルタを宣言すると、特定のインテント タイプを持つアクティビティを他のアプリから直接開始できるようになります。同様に、アクティビティでインテント フィルタを宣言しない場合は、明示的インテントでのみアクティビティを開始できます。

警告: アプリの安全性を保つため、Service を開始するときは常に明示的インテントを使用し、サービスでインテント フィルタを宣言しないようにしてください。 暗黙的インテントを使ってサービスを開始すると、どのサービスがインテントに応答するかを把握できず、ユーザーにはどのサービスが開始するのかがわからないため、セキュリティ上の危険が伴います。 Android 5.0(API レベル 21)以降では、暗黙的インテントで bindService() を呼び出すと、システムから例外がスローされます。

インテントを作成する

Intent オブジェクトには Android システムが開始するコンポーネントを決定する際に使用する情報(インテントを受け取るべき正確なコンポーネント名やコンポーネントのカテゴリなど)に加えて、受け取る側のコンポーネントがアクションを適切に実行するために使用する情報(実行するアクションと、実行対象のデータなど)が含まれています。

Intent に含まれる主な情報は次のとおりです。

コンポーネント名
開始するコンポーネントの名前です。

これは省略可能ですが、インテントを明示的にするためには不可欠な情報です。つまり、コンポーネント名で定義されたアプリ コンポーネントにのみ、インテントが配信されます コンポーネント名がない場合、インテントは暗黙的になり、他のインテント情報(下記で説明するアクション、データ、カテゴリなど)に基づいてインテントを受け取るべきコンポーネントをシステムが決定します そのため、アプリ内の特定のコンポーネントを開始する必要がある場合は、コンポーネント名を指定する必要があります。

注: Service を開始するときは、常にコンポーネント名を指定する必要があります。 指定しない場合、どのサービスがインテントに応答するかが把握できなくなり、ユーザーはどのサービスが開始するのかがわからなくなります。

Intent のフィールドは ComponentName オブジェクトで、アプリのパッケージ名など、ターゲットのコンポーネントの完全修飾クラス名を使用して指定できます。 たとえば、com.example.ExampleActivity のようになります。 コンポーネント名は、setComponent()setClass()setClassName()Intent コンストラクタなどを使用して設定できます。

アクション
実行する全体的なアクションを指定する文字列です(閲覧や選択など)。

ブロードキャスト インテントの場合、これが発生済みで報告済みのアクションになります。ほとんどのアクションは、残りのインテントがどのように構成されているか、特にデータやエクストラに含まれている内容によって決まります。 —

インテントによって自身のアプリで使用する(または他のアプリで使用して自身のアプリのコンポーネントを呼び出す)独自のアクションを指定できますが、通常は Intent クラスや他のフレームワーク クラスで定義されたアクション定数を使用します。 アクティビティを開始する際の一般的なアクションをいくつか次に示します。

ACTION_VIEW
ギャラリー アプリで表示する写真や、マップアプリで表示する住所など、アクティビティ内にユーザーに表示する情報がある場合は、startActivity() を使ってインテントにこのアクションを使用します。
ACTION_SEND
これは「共有」インテントとしても知られており、メールアプリやソーシャル シェアリング アプリなどの他のアプリ経由でユーザーが共有できるデータがある場合に、startActivity() でインテントに使用します。

全体的なアクションを定義するその他の定数については、Intent クラスのリファレンスをご覧ください。 システムの設定アプリで特定の画面を開くアクションの Settings など、他のアクションは Android フレームワークの別の場所で定義されます。

インテントのアクションは、setAction()Intent コンストラクタを使って指定できます。

独自のアクションを定義したら、接頭辞としてアプリのパッケージ名を必ず含めます。 次に例を示します。

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
データ
アクションの実行対象であるデータや、データの MIME タイプを参照する URI(Uri オブジェクト)です。 提供されるデータタイプは、インテントのアクションによって決まります。たとえば、アクションが ACTION_EDIT の場合、データには編集するドキュメントの URI が含まれます。

インテントの作成時、URI だけでなくデータタイプ(MINE タイプ)を指定することが重要な場面が多くあります。たとえば、画像を表示できるアクティビティの場合、URI 形式は似ていてもオーディオ ファイルは再生できません。そのため、データの MIME タイプを指定することで、Android システムがインテントを受け取るのに最適なコンポーネントを見つけることができます。ただし、MIME タイプは URI から推測できることもあります。特にデータが content: URI の場合は、データが端末上にあり、 ContentProvider に制御されるデータであることを示すため、システムからデータの MIME タイプがわかるようになります。

データ URI のみを設定するには、setData() を呼び出します。MIME タイプのみを設定するには、setType() を呼び出します。 必要であれば、setDataAndType() を使って両方を明示的に設定することもできます。

警告: URI と MIME タイプの両方を設定する場合は、お互いの値を無効にしてしまわないよう、setData()setType()呼び出さないでください。URI と MIME タイプの両方を設定する場合は、常に setDataAndType() を使用してください。

カテゴリ
インテントを処理するコンポーネントの種類に関する追加情報が含まれた文字列です。 カテゴリの記述は、インテントにいくつでも含めることができますが、ほとんどのインテントではカテゴリは必須ではありません。一般的なカテゴリの例を次に示します。
CATEGORY_BROWSABLE
ターゲットのアクティビティは、ウェブブラウザから開始して画像やメール メッセージなど、リンクで参照されたデータを表示できます。
CATEGORY_LAUNCHER
このアクティビティはタスクの初期のアクティビティで、システムのアプリケーション ランチャーの一覧に表示されます。

カテゴリの全一覧は、Intent クラスの説明をご覧ください。

カテゴリは、addCategory() を使って指定できます。

上記のプロパティ(コンポーネント名、アクション、データ、カテゴリ)は、インテントの特性の定義を表しています。 これらのプロパティを読み取ることで、Android システムはどのアプリ コンポーネントを開始すべきかを解決できます。

ただし、インテントにはアプリ コンポーネントの解決に影響を与えない追加情報を含めることもできます。 インテントに含めることのできる情報は次のとおりです。

エクストラ
要求されたアクションの実行に必要な追加情報のキーと値のペアです。データの URI の特定の種類を使用するアクションがあるのと同様に、特定のエクストラを使用するアクションもあります。

エクストラはさまざまな putExtra() を使って追加でき、それぞれがキー名と値の 2 つのパラメータを受け入れます。また、すべてのエクストラ データを使って Bundle オブジェクトを作成し、putExtras() を使って BundleIntent に挿入することもできます。

たとえば、ACTION_SEND を使ってメールを送信するインテントを作成するとき、EXTRA_EMAIL キーを使って「宛先」の受信者を指定したり、EXTRA_SUBJECT を使って「件名」を指定したりできます。

Intent クラスでは多くの標準データタイプの EXTRA_* 定数を指定できます。 独自のエクストラ キーを宣言する必要がある場合は(アプリが受け取るインテント用に)、アプリのパッケージ名を接頭辞として必ず含めます。 次に例を示します。

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
フラグ
Intent クラスで定義されるフラグは、インテントのメタデータとして機能します。 フラグは、Android システムにアクティビティの起動方法(アクティビティがどのタスクに属するかなど)や、起動後の取り扱い方法(最近のアクティビティの一覧に含めるかどうかなど)を指示します。

詳細については、setFlags() メソッドをご覧ください。

明示的インテントの例

明示的インテントは、アプリ内の特定のアクティビティやサービスなど、特定のアプリ コンポーネントを起動する際に使用するものです。 明示的インテントを作成するには、Intent オブジェクトでコンポーネント名を定義します。他のインテント プロパティはすべて省略可能です。

たとえば、アプリでウェブからファイルをダウンロードするサービスを DownloadService という名前で作成した場合、次のコードでそれを開始できます。

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

Intent(Context, Class) コンストラクタがアプリに Context を、コンポーネントに Class オブジェクトを提供します。 このようにして、このインテントはアプリの DownloadService クラスを明示的に開始します。

サービスのビルドと開始の詳細については、サービスのガイドをご覧ください。

暗黙的インテントの例

暗黙的インテントは、端末上のどんなアプリでも実行できるアクションを指定します。 暗黙的インテントは、自身のアプリではそのアクションを実行できないが、他のアプリでは実行可能であり、どのアプリを使うかをユーザーに選ばせたい場合に便利です。

たとえば、他のユーザーと共有できるようにするコンテンツがある場合は、ACTION_SEND アクションを使ってインテントを作成し、共有するコンテンツを指定するエクストラを追加します。 そのインテントで startActivity() を呼び出すと、ユーザーはどのアプリでコンテンツを共有するかを選択できます。

警告: startActivity() に送る暗黙的インテントを処理できるアプリがユーザーが持っていない場合もあります。 その場合、呼び出しは失敗し、アプリはクラッシュします。アクティビティが必ずインテントを受け取るようにするには、Intent オブジェクトで resolveActivity() を呼び出します。 結果が null 以外の場合は、インテントを処理できるアプリが少なくとも 1 つはあることを意味し、startActivity() を安全に呼び出すことができます。 結果が null の場合は、そのインテントは使用せず、可能であればそのインテントを発行する機能を無効にする必要があります。

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

注: この場合、URI は使用されませんが、エクストラに含まれるコンテンツを指定するためインテントのデータタイプは宣言されます。

startActivity() が呼び出されたとき、システムによってすべてのインストール済みアプリの中にこのタイプのインテント(ACTION_SEND アクションとテキスト/プレーン データが含まれるインテント)を処理できるものがあるかどうかが確認されます インテントを処理できるアプリが 1 つしかない場合は、そのアプリがすぐに開いてインテントを受け取ります。 インテントを処理できるアクティビティが複数ある場合、ユーザーが使用するアプリを選択できるダイアログが表示されます。

図 2 チューザのダイアログ

アプリチューザを表示する

暗黙的インテントに応答するアプリが 2 つ以上ある場合、ユーザーは使用するアプリを選択でき、そのアプリをアクションに対するデフォルトの選択肢にすることができます。 これは、ウェブページを開いたり、(1 つのカメラを選ぶ傾向にあるユーザーが) 写真を撮影したりといったアクションの実行時に、ユーザーが今後同じアプリの使用を希望するような場合に便利です(ユーザーは常に同じウェブブラウザを使用する傾向があります)。

ただし、インテントに応答するアプリが複数あって、ユーザーが毎回別のアプリを使用する可能性がある場合は、チューザのダイアログを明示的に表示する必要があります。 チューザのダイアログでは、 アクションのたびに使用するアプリをユーザーに選択させます(ユーザーはアクションのデフォルトのアプリを選択できません)。 たとえば、アプリが ACTION_SEND アクションを使って「共有」を実行するとき、ユーザーが現在の状況によって別のアプリを使用して共有する場合もあるため、図 2 のようにチューザのダイアログは常に表示する必要があります。

チューザを表示するには、createChooser() を使用して Intent を作成し、startActivity() に渡します。次に例を示します。

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

これにより、createChooser() メソッドに渡されたインテントに応答するアプリのリストがダイアログに表示され、指定されたテキストがダイアログのタイトルになります。

暗黙的インテントを受け取る

アプリが受け取ることのできる暗黙的インテントを通知するには、マニフェスト ファイル<intent-filter> 要素を使ってアプリのコンポーネントごとに 1 つ以上のインテント フィルタを宣言します。各インテント フィルタには、インテントのアクション、データ、カテゴリに基づいて受け入れるインテントのタイプを指定します。 インテントがいずれかのインテント フィルタを通過した場合のみ、システムが暗黙的インテントをアプリのコンポーネントに配信します。

注: 明示的インテントは、コンポーネントが宣言しているインテント フィルタに関係なく、常にターゲットに配信されます。

アプリのコンポーネントは固有のジョブそれぞれに対して個別のフィルタを宣言する必要があります。たとえば、画像キャラリーのアプリの 1 つのアクティビティには、画像を表示するフィルタと、画像を編集するフィルタの 2 つがあります。 アクティビティが開始すると、Intent を調べて Intent にある情報に基づいてどのように動作するかを決定します(編集コントロールを表示するかどうかなど)。

各インテント フィルタは、アプリのマニフェスト ファイルの <intent-filter> 要素で定義され、これは対応するアプリのコンポーネント(<activity> 要素など)にネストされます。 <intent-filter> 内で、次の 3 つの要素のなかで 1 つ以上を使用して、受け入れるインテントのタイプを指定できます。

<action>
name 属性で、受け入れるインテントのアクションを宣言します。値は、クラス定数ではなく、アクションのリテラル文字列値である必要があります。
<data>
データ URI (schemehostportpath など) や MIME タイプのさまざまな側面を指定する 1 つ以上の属性を使用して、受け入れるデータのタイプを宣言します。
<category>
name 属性で、受け入れるインテントのカテゴリを宣言します。値は、クラス定数ではなく、アクションのリテラル文字列値である必要があります。

注: 暗黙的インテントを受け取るには、インテント フィルタに CATEGORY_DEFAULT カテゴリを含める必要があります。 startActivity() メソッドと startActivityForResult()メソッドはすべてのインテントを、CATEGORY_DEFAULT カテゴリを宣言しているものとして処理します。 インテント フィルタでカテゴリを宣言していない場合、暗黙的インテントはアクティビティに紐付けされません。

次に、データ タイプがテキストの場合に、ACTION_SEND インテントを受け取るインテント フィルタを使用したアクティビティ宣言の例を示します。

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

<action><data><category> のうち 2 つ以上のインスタンスを含むフィルタを作成することもできます。その場合、コンポーネントがそれらのフィルタ要素のすべての組み合わせを処理できることを確認しておきます。

複数のタイプのインテントに対応しながら、アクション、データ、カテゴリタイプの特定の組み合わせのみを処理する場合は、複数のインテント フィルタを作成する必要があります。

暗黙的インテントは、3 つの要素それぞれへのインテントを比較して、フィルタでテストされます。 コンポーネントに配信されるには、インテントが 3 つのテストすべてを通過する必要があります。一致しないものが 1 つでも場合、Android システムはインテントをコンポーネントに配信しません。 ただし、コンポーネントは複数のインテント フィルタを保持していることもあるため、1 つのインテント フィルタを通過できなかったインテントでも、別のフィルタを通過できる場合があります。システムによるインテント解決の詳細は、次のセクションのインテントの解決で説明します。

警告: 他のアプリの Service で誤って実行されないように、自身のサービスは常に明示的インテントを使用して開始し、サービスではインテント フィルタは宣言しないでください。

注: すべてのアクティビティにおいて、インテント フィルタはマニフェスト ファイルで宣言する必要があります。ただし、ブロードキャスト レシーバーのフィルタは、registerReceiver() を呼び出すことで動的に登録できます。 その後、レシーバーの登録を解除するには、unregisterReceiver() を使用します。これにより、アプリが実行中の特定の期間だけ、アプリが特定のブロードキャストをリッスンできるようになります。

フィルタの例

インテント フィルタの動作をより深く理解するため、ソーシャル シェアリング アプリのマニフェスト ファイルからの次のスニペットをご覧ください。

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

1 つ目のアクティビティである MainActivity は、アプリのメイン エントリ ポイントで、ユーザーがランチャー アイコンから初めてアプリを起動したときに開くアクティビティです。

アクティビティをアプリ ランチャーに表示するには、この 2 つをペアリングする必要があります。

2 つ目のアクティビティである ShareActivity が、テキストやメディア コンテンツの共有を促します。 ユーザーは MainActivity に移動することでこのアクティビティに入ることもありますが、2 つのインテント フィルタのいずれかに一致する暗黙的インテントを発行する別のアプリから直接 ShareActivity に入ることもできます。

注: MIME タイプ(application/vnd.google.panorama360+jpg)は、パノラマ写真を指定する特別なデータタイプで、Google panorama API を使って処理できます。

ペンディング インテントを使用する

PendingIntent オブジェクトは、Intent オブジェクトのラッパーです。PendingIntent の主な目的は、別のアプリケーションに Intent をアプリ自身のプロセスから実行したように使用できるパーミッションを付与することです。

ペンディング インテントの主な使用例には、次のようなものがあります。

Intent オブジェクトはアプリの特定のタイプのコンポーネント(ActivityServiceBroadcastReceiver のいずれか)で処理されることを前提としているため、PendingIntent も同様の前提で作成する必要があります。 ペンディング インテントを使用する場合、アプリはインテントの実行時に startActivity() などの呼び出しを行いません。 代わりに、PendingIntent の作成時にそれぞれのクリエーター メソッドを呼び出して目的のコンポーネント タイプを宣言する必要があります。

アプリが他のアプリからペンディング インテントを受け取る場合を除いて、PendingIntent の作成時に必要となる PendingIntent メソッドはほぼ上記の 3 つのみです。

各メソッドが現在のアプリの Context、ラップする Intent、インテントの使用方法を指定する 1 つ以上のフラグ(インテントを 2 回以上できるかどうかなど)を受け取ります。

ペンディング インテントの使用に関する詳細については、通知App Widgets など、それぞれの使用例の API ガイドをご覧ください。

インテント解決

システムがアクティビティを開始する暗黙的インテントを受け取ると、次の 3 つの側面に基づいてインテントをインテント フィルタと比較し、そのインテントに最適なアクティビティを検索します。

次のセクションでは、インテント フィルタがアプリのマニフェスト ファイルでどのように宣言されているかという観点から、インテントが適切なコンポーネントに紐付けられる方法について説明します。

アクションのテスト

受け入れるインテントのアクションを指定するには、インテント フィルタでゼロ個以上の <action> 要素を宣言します。 次に例を示します。

<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>

このフィルタを通過するには、Intent で指定されたアクションが、フィルタにリストされたアクションのいずれかに一致する必要があります。

フィルタのリストにアクションが 1 つもない場合は、インテントに一致するものがないため、すべてのインテントがテストに失敗します。 ただし、Intent がアクションを指定していない場合は、テストに合格します(フィルタに少なくとも 1 つのアクションが含まれている必要があります)。

カテゴリのテスト

受け入れるインテントのカテゴリを指定するには、インテント フィルタでゼロ個以上の <category> 要素を宣言します。 次に例を示します。

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    ...
</intent-filter>

インテントがカテゴリのテストに合格するには、Intent 内のすべてのカテゴリが、フィルタ内のカテゴリに一致する必要があります。 インテント フィルタでは、Intent で指定されたカテゴリよりも多くのカテゴリが宣言されている場合もあるため、すべてが Intent に一致しなくてもテストには合格します。 そのため、カテゴリのないインテントは、フィルタで宣言されているカテゴリに関係なく、常にこのテストに合格することになります。

注: Android では、startActivity()startActivityForResult() に渡されるすべての暗黙的インテントに CATEGORY_DEFAULT カテゴリを自動的に適用します。そのため、アクティビティで暗黙的インテントを受け取りたい場合は、前出の <intent-filter> の例のように、アクティビティのインテント フィルタに "android.intent.category.DEFAULT" のカテゴリを含める必要があります。

データのテスト

受け入れるインテント データを指定するには、インテント フィルタでゼロ個以上の <data> 要素を宣言します。 次に例を示します。

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>

<data> 要素では、URI 構造とデータタイプ(MIME メディア タイプ)を指定できます。 URI の各パートには、schemehostportpath の個別の属性があります。

<scheme>://<host>:<port>/<path>

次に例を示します。

content://com.example.project:200/folder/subfolder/etc

この URI では、スキームが content、ホストが com.example.project、ポートが 200、パスが folder/subfolder/etc です。

これらの各属性は <data> 要素では省略可能ですが、一次従属性があります。

インテントの URI をフィルタの URI 仕様に比較するときは、フィルタに含まれる URI の一部でのみ比較されます。 次に例を示します。

注: パスの指定では、ワイルドカードのアスタリスク(*)を使ってパス名の部分一致のみを要求することもできます。

データのテストでは、インテントの URI と MIME タイプの両方を、フィルタで指定された URI と MIME タイプと比較します。 規則は次のとおりです。

  1. URI も MIME タイプも含まないインテントは、フィルタで URI や MIME タイプが指定されていない場合のみテストをパスします。
  2. URI を含んでいて MIME タイプを含んでいないインテント(明示的にも含まれておらず、URI からも推測できない)場合は、URI がフィルタの URI 形式に一致し、フィルタが MIME タイプを指定していない場合のみテストをパスします。
  3. MIME タイプを含んでいて、URI を含んでいないインテントは、フィルタのリストに同じ MIME タイプがあり、URI 形式が指定されていない場合のみテストをパスします。
  4. URI と MIME タイプの両方を含む(明示的または URI からの推測)インテントは、MIME タイプがフィルタのリストにあるタイプに一致した場合のみ、テストの MIME タイプのパートをパスします。 テストの URI のパートは、URI がフィルタの URI に一致するか、content: URI または file: URI があって URI が指定されていない場合にパスできます。 つまり、フィルタリストに MIME タイプのみがある場合、コンポーネントは content: データと file: データをサポートすると推定されます。

この最後の規則(d)は、コンポーネントがファイルやコンテンツ プロバイダからのローカル データを取得できるという予測を反映しています。そのため、フィルタにはデータタイプのみをリストして、content: スキームや file: スキームを明示的に指定する必要はありません。これは一般的なケースです。 たとえば、次の <data> 要素は、コンポーネントがコンテンツ プロバイダからの画像データを取得し、それを表示できることを Android に伝えています。

<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

利用可能なデータはほとんどコンテンツプロバイダによって投入されることから、データタイプが指定されていて URI 指定されていないデータが最も一般的です

もうひとつ一般的な設定として、スキームと データタイプを使ったフィルタがあります。たとえば、次の <data> 要素は、アクションを実行するためにコンポーネントがネットワークから動画データを取得できることを Android に伝えています。

<intent-filter>
    <data android:scheme="http" android:type="video/*" />
    ...
</intent-filter>

インテントのマッチング

インテントをインテント フィルタにマッチングする目的には、アクティベートするターゲットを発見するということだけでなく、端末上のコンポーネントのセットに関連する何かを発見するという目的があります。 たとえば、ホーム アプリは ACTION_MAIN アクションと CATEGORY_LAUNCHER カテゴリを指定するインテント フィルタを持つすべてのアクティビティを見つけることで、アプリ ランチャーを設定します。

アプリでも、同様の方法でインテントのマッチングを使用できます。PackageManager には特定のインテントを受け入れることのできるすべてのコンポーネントを返す一連の query...() メソッドと、同様にインテントに応答できる最適なコンポーネントを返す一連の resolve...() メソッドがあります。 たとえば、queryIntentActivities() は引数として渡されたインテントを実行できるすべてのアクティビティの一覧を返し、queryIntentServices() は同様のサービスの一覧を返します。いずれのメソッドでもコンポーネントのアクティベートは行われず、応答できるものを列挙するだけです。 ブロードキャスト レシーバー用にも、同様のメソッド queryBroadcastReceivers() があります。

This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.