【问题标题】:Is android.intent.action.DOWNLOAD_COMPLETE an explicit broadcast?android.intent.action.DOWNLOAD_COMPLETE 是显式广播吗?
【发布时间】:2019-01-11 10:44:36
【问题描述】:

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

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

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

我正在将我的应用的 targetSdk 迁移到 27 (Oreo)。根据https://developer.android.com/about/versions/oreo/background#broadcasts通过清单注册的隐式广播接收器不应该在 Android O 中工作whitelisted exceptions 除外)。

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

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

有人知道android.intent.action.DOWNLOAD_COMPLETE 是显式广播而不是隐式广播吗?任何想法为什么我的接收器仍在接收该广播?

【问题讨论】:

    标签: android broadcastreceiver android-manifest android-8.0-oreo android-download-manager


    【解决方案1】:

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

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

    2) 当请求下载时,该包名称被插入到下载数据库中的列Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE

    3) 下载完成后,DownloadInfo.sendIntentIfRequested() 方法将调用Intent.setPackage() 传递包名。根据description of method Intent.setPackage()

    (通常可选)设置一个明确的应用程序包名称, 限制此 Intent 将解析到的组件。如果留给 默认值为 null,所有应用程序中的所有组件都将 经过考虑的。如果非空,则 Intent 只能匹配中的组件 给定的应用程序包。

    根据该描述,我的理解是广播意图将针对我的应用,因此作为显式意图工作。

    【讨论】:

    • 感谢您的调查。我们目前处于同样的情况,刚刚就这个话题进行了另一次讨论。根据您的发现,我认为我们可以避免重构为 JobScheduler 的工作。
    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多