android.intent.action.DOWNLOAD_COMPLETE是一个明确的广播?

Bru*_*eno 6 android broadcastreceiver android-manifest android-download-manager android-8.0-oreo

我的应用程序(targetSdk = 25)在清单中定义了广播接收器,如下所示:

<receiver android:name="my.package.DownloadManagerReceiver"
     android:exported="true">
     <intent-filter>
          <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
     </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

DownloadManagerReceiver当Android的DownloadManager完成下载文件时,我会收到通知,因此我可以对下载的文件进行一些处理.

我正在努力将我的应用程序的targetSdk迁移到27(奥利奥).根据https://developer.android.com/about/versions/oreo/background#broadcasts,通过清单注册的隐式广播接收器不应该在Android O中工作(除了那些列入白名单的例外).

但是,当我使用运行Android 8.0和targetSdk = 27的模拟器运行我的应用程序时,清单中定义的广播接收器仍然会在下载完成后由DownloadManager 通知.

我试图找到DownloadManager发送其广播的源代码,以了解它如何发送其广播,但我找不到它.

有人知道是否android.intent.action.DOWNLOAD_COMPLETE是一个明确的广播而不是一个隐含的广播?我的接收器仍然接收该广播的任何想法?

Bru*_*eno 7

这是我在深入挖掘平台源代码后发现的:

1)当我们实例化DownloadManager时,它会保留对应用程序上下文的引用,并从该上下文中提取应用程序的包名称

2)Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE在请求下载时,将包名称插入到下载数据库中

3)下载完成后,DownloadInfo.sendIntentIfRequested()方法将调用传递包名称的Intent.setPackage().根据方法Intent.setPackage()描述:

(通常是可选的)设置显式应用程序包名称,以限制此Intent将解析的组件.如果保留默认值null,则将考虑所有应用程序中的所有组件.如果为非null,则Intent只能匹配给定应用程序包中的组件.

基于该描述,我的理解是广播意图将针对我的应用程序,因此作为明确的意图.