Различают неявный широковещательный приемник и явный широковещательный приемник в манифесте

Согласно руководству по миграции на 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+.

Другие вопросы по тегам