Различают неявный широковещательный приемник и явный широковещательный приемник в манифесте
Согласно руководству по миграции на Android O, предоставленному Google, большая часть неявных намерений вещания не должна регистрироваться в манифесте (за исключением нескольких исключений, найденных здесь), но явные намерения вещания остаются нетронутыми.
Мы стремимся убрать любую необходимую трансляцию из манифеста. Но как мы узнаем, если получатель неявный? Есть ли общее правило?
Вот пример трансляций, которые мы регистрируем в манифесте. Должны ли мы смотреть только на тег "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" не занесено в белый список. Должны ли мы зарегистрировать это в деятельности? Если так, то не будет ли он запущен, как когда мы регистрируем его, приложение уже установлено? Это то, что смущает меня, когда я пытаюсь понять, является ли получатель вещания неявным или явным, так как я думал, что мне нужно только проверить этот тег "action".
1 ответ
Но как мы узнаем, если получатель неявный?
Если Intent
имеет ComponentName
, Intent
явный В противном случае, это неявно.
Тот ComponentName
можно получить одним из нескольких способов, в том числе:
Это может быть непосредственно надето на
Intent
(например,new Intent(this, TheReallyAwesomeReceiver.class
)Это может быть непосредственно надето на
Intent
после использованияPackageManager
а такжеqueryIntentReceivers()
найти правильный, основанный на строках действий и т. д.Он может быть получен системой из строки действия и т. Д. Плюс пакет, определенный через
setPackage()
Должны ли мы смотреть только на тег "action" и видеть, включен ли он в белый список, чтобы сохранить его в манифесте?
Нет. Вам также нужно подумать о характере трансляции: идет ли она на какой-либо зарегистрированный приемник или только на конкретное приложение?
Например, намерение "com.android.vending.INSTALL_REFERRER" не занесено в белый список. Должны ли мы зарегистрировать это в деятельности?
Нет. Эта трансляция будет идти только на приложение, которое было недавно установлено, и поэтому оно должно быть явным Intent
, Строка действия и тому подобное помогут системе определить, какой из ваших зарегистрированных получателей является релевантным.
Сравните это с ACTION_PACKAGE_ADDED
, Это передается любому зарегистрированному получателю; это не собирается только одно определенное приложение. Следовательно, что Intent
должен быть неявным (в противном случае он будет иметь ComponentName
определение конкретного получателя в конкретном приложении). И с тех пор ACTION_PACKAGE_ADDED
отсутствует в белом списке, следует исходить из того, что вы не можете зарегистрироваться для этой трансляции в манифесте на Android 8.0+.