web-dev-qa-db-ja.com

マニフェストで暗黙的なブロードキャストレシーバーと明示的なブロードキャストレシーバーを区別する

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」インテントはホワイトリストに登録されていません。アクティビティに登録する必要がありますか?登録した場合、アプリは既にインストールされているため、起動されないでしょうか?これは、ブロードキャストレシーバーが暗黙的または明示的であるかどうかを理解しようとするとき、その「アクション」タグだけをチェックする必要があると思ったときに混乱させるものです。

19
Gauthier

しかし、受信者が暗黙的であるかどうかをどのように認識するのでしょうか?

IntentComponentNameがある場合、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+。

31
CommonsWare