Является ли android.intent.action.DOWNLOAD_COMPLETE явной трансляцией?

Мое приложение (targetSdk = 25) имеет широковещательный приемник, определенный в манифесте следующим образом:

<receiver android:name = "my.package.DownloadManagerReceiver"
     android:exported = "true">
     <intent-filter>
          <action android:name = "android.intent.action.DOWNLOAD_COMPLETE" />
     </intent-filter>
</receiver>

Мой DownloadManagerReceiver получает уведомление, когда Менеджер загрузки Android завершает загрузку файла, поэтому я могу выполнить некоторую обработку загруженного файла.

Я работаю над переносом targetSdk моего приложения на 27 (Oreo). Согласно https://developer.android.com/about/versions/oreo/background#broadcasts, неявные широковещательные приемники, зарегистрированные через манифест, не должны работать в Android O (кроме тех исключения из белого списка).

Однако, когда я запускаю свое приложение с помощью эмулятора под управлением Android 8.0 и targetSdk = 27 мой широковещательный приемник, определенный в манифесте, все еще уведомляется с помощью DownloadManager после завершения загрузки.

Я попытался найти исходный код, в котором DownloadManager отправляет свою трансляцию, чтобы понять, как он отправляет свои трансляции, но я не смог его найти.

Кто-нибудь знает, является ли android.intent.action.DOWNLOAD_COMPLETE явной трансляцией, а не неявной? Есть идеи, почему мой ресивер все еще принимает эту трансляцию?

7
0
1 301
1

Ответы 1

Вот что я обнаружил, углубившись в исходный код платформы:

1) Когда мы создаем экземпляр DownloadManager, он сохраняет ссылку на контекст приложения и извлекает имя пакета приложения из этого контекста.

2) Это имя пакета вставляется в базу данных загрузок в столбец Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE при запросе загрузки.

3) Когда загрузка завершится, метод DownloadInfo.sendIntentIfRequested () вызовет Intent.setPackage (), передав имя пакета. Согласно описание метода Intent.setPackage ():

(Usually optional) Set an explicit application package name that limits the components this Intent will resolve to. If left to the default value of null, all components in all applications will considered. If non-null, the Intent can only match the components in the given application package.

Основываясь на этом описании, я понимаю, что намерение вещания будет нацелено на мое приложение, таким образом, работая как явное намерение.

Спасибо за расследование. Сейчас мы находимся в такой же ситуации, и только что провели еще одно обсуждение этой темы. Основываясь на ваших выводах, я думаю, что мы можем избежать попытки рефакторинга JobScheduler.

ASP 10.08.2018 16:56

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