android:exported属性について
android:exportedとは
アプリのService
Activity
Provider
Receiver
を、外部アプリに公開するかどうか設定する属性。
どこに設定するのか
AndroidManifest.xmlの<service>
<activity>
<provider>
<receiver>
タグに記述する。
今回は<service>
と<activity>
だけ調べてみた。
serviceタグの場合
外部アプリが自身のアプリのServiceを呼び出せるか、やりとり出来るかを指定する。
true
は「許可」、false
なら「許可しない」。
false
の場合、同じアプリのコンポーネントまたは同じユーザーIDを持つアプリのみが、Serviceを開始・バインドすることが出来る。
exportedのデフォルト値は、serviceタグ内に<intent-filter>
が記述されているかどうかで変わる。
記述されていない場合
デフォルト値はfalse
。
<intent-filter>
がない場合「Serviceの正確なクラス名がないと呼び出せない」=「外部アプリがクラス名を知ることはないので、自身のアプリ内でのみ呼び出すことが出来る」。
記述されている場合
1つでも<intent-filter>
が存在すれば、デフォルト値はtrue
になる。
activityタグの場合
外部アプリが自身のアプリのActivityを起動出来るかを指定できる。
Service同様true
なら許可、false
なら許可しない。
false
のときは同アプリのコンポーネまたは同じユーザーIDのアプリからのみ起動できる。
<intent-filter>
を使っているときは、exportedをfalse
にしない
<intent-filter>
を設定した状態でandroid:exported=false
にしてしまうと、ActivityNotFoundException
がスローされてしまう。
<intent-filter>
がない場合
デフォルト値はfalse
。
android:exported=true
を設定すると、正確なクラス名を知っているアプリから呼び出すことが出来るようになる。
ただ、暗黙的インテントでは呼び出すことは出来ない。
Discussion