Android OSは、アプリ間の機能連携を実現するために、アプリから他のアプリの機能(コンポーネント)を呼び出す仕組みを提供しています。
この仕組みを「Intent」と呼びます。
Intentを使用することにより、下の図のようにカメラアプリで撮影した写真を、別アプリのメール送信機能を使って、
友人に宛てて送信するといった事が可能になります。
 |
Intentによる機能の呼び出しイメージ
|
Intentはアプリ連携を実現する重要なものですが、疎結合のアプリ間でやり取りされるために想定外のアプリにIntentが渡ってしまう、
または悪意のあるアプリからIntentを受け取ってしまう、といった可能性があります。開発者はIntentのこのような問題を正しく理解してアプリを設計しなければいけません。
Intentに対するアクセス制限
Intentが保護されていない場合、想定外のアプリからIntentを受け取ってしまうことにより、アプリの機能を悪用される可能性があります。
このような問題が起きる事を防ぐために、コンポーネントが受信できるIntentを制限することができるようになっています。
設定は、Intentを受け取る側のアプリの「AndroidManifest.xml」ファイルに記述します。
例えば、他のアプリからのIntentを一切受け取らないようにしたり、特定のPermissionを持つアプリからのIntentだけを受け取るように制限したりすることが可能です。
 |
Intentのアクセス制限イメージ
|
上の図の例は、メールアプリ側で、機能(コンポーネント)が受信するIntentを制限している例です。
カメラアプリからメール送信機能へ向けたIntentはメールアプリに受信されますが、メール受信機能へ向けたIntentは、メールアプリは受け取りません。
これでメールアプリのメール受信機能は保護されていることになります。
Intentの種類
Intentには、受信先を明示的に指定する「明示的Intent」と、受取り先のアプリの条件だけを指定する「暗黙的Intent」の2種類があります。
明示的Intentと暗黙的Intentの制限方法の違い
|
Intentの種類 |
制限の設定方法 |
明示的Intent
|
Intentの受信先をクラス名で明示しているIntentです。
Intentを送信する側のアプリが受信先のアプリを特定しているため、指定したアプリ以外がIntentを受信することはありません。
Intentを受信する側は、想定外のアプリからIntentを受け取る可能性があるので、想定外のアプリからのIntentを受信する事がないように制限を設定します。
制限は、「AndroidManifest.xml」ファイルにコンポーネント毎に記述します。
|
暗黙的Intent
|
「Intentの受信先を明示せず、受取り先のアプリの条件だけを指定しているIntentです。
Intentを送信する側のアプリは、受信先アプリを特定していないので、想定外のアプリがIntentを受信する可能性があります。
暗黙的Intentを受信する側は、受け取るIntentの条件を「AndroidManifest.xml」に記載します(この設定を「IntentFilter」と呼びます)。明示的Intentの場合と同様に、
想定外のアプリからIntentを受け取る可能性があるので、想定外のアプリからのIntentを受信する事がないように制限を設定します。
この制限も「AndroidManifest.xml」ファイルにコンポーネント毎に記述します。
|
|
明示的Intentを発行した場合は相手のアプリは一意に決まります。
暗黙的Intentを発行した場合は条件に合致するアプリが複数見つかることがあります。
この場合は、Android OSによって起動するアプリを選択する画面が表示され、利用者がIntentを受信するアプリを選択することになります。