Googleが提供するAndroid Oへの移行ガイドによると、暗黙的なブロードキャストインテントのほとんどはマニフェストに登録されるべきではありません(いくつかの例外は見つかりません here )明示的なブロードキャストの意図は変更されません。
必要なブロードキャストをマニフェストから遠ざけたいと考えています。しかし、受信者が暗黙的であるかどうかをどのように認識するのでしょうか?一般的なルールはありますか?
マニフェストに登録するブロードキャストのサンプルを次に示します。 「action」タグのみを見て、マニフェストに保持するためにホワイトリストに登録されているかどうかを確認する必要がありますか?
<receiver
Android:name=".receiver.ImageBroadcastReceiver"
Android:enabled="true" >
<intent-filter>
<action Android:name="Android.hardware.action.NEW_PICTURE" />
<category Android:name="Android.intent.category.OPENABLE" />
<data Android:mimeType="image/*" />
</intent-filter>
</receiver>
<receiver
Android:name=".receiver.InstallReferrerReceiver"
Android:exported="true">
<intent-filter>
<action Android:name="com.Android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<receiver Android:name=".receiver.JoinEventReceiver" >
<intent-filter>
<action Android:name="JOIN_ACTION" />
<action Android:name="CANCEL_ACTION" />
<action Android:name="DECLINE_ACTION" />
</intent-filter>
</receiver>
たとえば、「com.Android.vending.INSTALL_REFERRER」インテントはホワイトリストに登録されていません。アクティビティに登録する必要がありますか?登録した場合、アプリは既にインストールされているため、起動されないでしょうか?これは、ブロードキャストレシーバーが暗黙的または明示的であるかどうかを理解しようとするとき、その「アクション」タグだけをチェックする必要があると思ったときに混乱させるものです。
しかし、受信者が暗黙的であるかどうかをどのように認識するのでしょうか?
Intent
にComponentName
がある場合、Intent
は明示的です。それ以外の場合、暗黙的です。
ComponentName
は、次のようないくつかの方法のいずれかで取得できます。
Intent
に直接配置できます(例、_new Intent(this, TheReallyAwesomeReceiver.class
_)
Intent
およびqueryIntentReceivers()
を使用してアクション文字列などに基づいて適切なものを見つけた後、PackageManager
に直接置くことができます。
システムは、アクション文字列などに加えて、setPackage()
を介して定義されたパッケージから派生できます。
「action」タグのみを見て、マニフェストに保持するためにホワイトリストに登録されているかどうかを確認する必要がありますか?
いいえ。ブロードキャストの性質についても考慮する必要があります。それはany登録済み受信機に送信されるのですか、それとも特定のアプリにのみ送信されるのですか?
たとえば、「com.Android.vending.INSTALL_REFERRER」インテントはホワイトリストに登録されていません。アクティビティに登録する必要がありますか?
いいえ。そのブロードキャストは、最近インストールされたアプリにのみ送信されるため、明示的なIntent
である必要があります。アクション文字列などは、登録された受信者のどれが関連する受信者であるかをシステムが判断するのに役立ちます。
それを_ACTION_PACKAGE_ADDED
_と比較してください。登録済みの受信者にブロードキャストされます。特定の1つのアプリだけではありません。したがって、そのIntent
は暗黙的でなければなりません(そうでない場合は、特定のアプリの特定の受信者を識別するComponentName
を持つことになります)。また、_ACTION_PACKAGE_ADDED
_はホワイトリストに登録されていないため、Android 8.0+。