Unterscheiden implizite broadcast receiver vs explizite broadcast receiver in der Manifestdatei
Gemäß dem migration guide to Android O gegeben von Google, die meisten der impliziten broadcast-intent sollte nicht registriert werden, die im Manifest (minus ein paar Ausnahmen gefunden hier), aber explizite broadcast intents bleiben unberührt.
Suchen wir verschieben alle benötigten broadcast-Weg aus dem manifest. Aber wie können wir erkennen, wenn ein Empfänger implizit ist? Gibt es eine Allgemeine Regel?
Hier ist ein Beispiel für die übertragungen registrieren wir im manifest. Sollte wir schauen nur auf die "action" - tag und sehen, wenn es in der Positivliste eingetragen ist es im manifest?
<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>
Beispielsweise "com.android.vending.INSTALL_REFERRER" Vorsatz ist nicht auf der Whitelist. Sollten wir registrieren, es in eine Aktivität? Wenn dem so ist, wäre es nicht nie abgefeuert, als wenn wir es registrieren die app bereits installiert ist? Dies ist, was mich verwirrt, wenn Sie versuchen zu verstehen, wenn ein broadcast receiver ist eine implizite oder explizite als ich dachte, ich hatte nur zu prüfen, ob "action" - tag.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die
Intent
hat eineComponentName
, dieIntent
ist explizit. Andernfalls ist es implizit.Dass
ComponentName
erhalten Sie eine der wenigen Möglichkeiten, einschließlich:Kann es direkt auf die
Intent
(z.B.new Intent(this, TheReallyAwesomeReceiver.class
)Kann es direkt auf die
Intent
nach der VerwendungPackageManager
undqueryIntentReceivers()
um die richtige zu finden, basierend auf action strings, etc.Kann abgeleitet werden, indem das system von der Aktion string, etc. plus-Paket definiert über
setPackage()
Nicht. Sie müssen auch zu denken über die Natur der Sendung: wird es alle registrierte Empfänger oder nur an eine bestimmte app?
Nicht. Dieser broadcast wird nur gehen, um die app, die kürzlich installiert wurde, und so muss es sein, eine explizite
Intent
. Die Aktion string und so sind da, um zu helfen, das system bestimmen, welche der registrierten Empfänger ist jeweils eine.Kontrast, der mit
ACTION_PACKAGE_ADDED
. Das ist broadcast an alle registrierten Empfänger; es ist nicht nur eine spezifische app. Daher, dassIntent
muss implizit sein (wie sonst hätte es einComponentName
Angabe eines bestimmten Empfänger in einer bestimmten app). Und daACTION_PACKAGE_ADDED
ist nicht auf der whitelist, die Annahme sollte sein, dass Sie nicht registriert werden, für die diese Sendung in der manifest auf Android 8.0+.