🦔

【Android】android:exported 属性とは?

2021/03/02に公開約1,000字

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>を使っているときは、exportedfalseにしない

<intent-filter>を設定した状態でandroid:exported=falseにしてしまうと、ActivityNotFoundExceptionがスローされてしまう。

<intent-filter>がない場合

デフォルト値はfalse
android:exported=trueを設定すると、正確なクラス名を知っているアプリから呼び出すことが出来るようになる。
ただ、暗黙的インテントでは呼び出すことは出来ない。

Discussion

ログインするとコメントできます