android.intent.action.DOWNLOAD_COMPLETE意图广播范围及接收问题问询
关于android.intent.action.DOWNLOAD_COMPLETE广播的疑问解答
好问题!我来一步步帮你理清这个广播的特性和你遇到的问题:
1. 它是系统级广播吗?
严格来说,android.intent.action.DOWNLOAD_COMPLETE是系统发出的广播,但它不属于全局可接收的系统广播——系统对这个广播的发送做了定向限制。
2. 哪些应用能接收这个广播?
这里分两种核心场景:
- 通过系统
DownloadManager发起的下载:当你用DownloadManager.enqueue()提交下载任务后,系统会在任务完成时,将DOWNLOAD_COMPLETE广播仅发送给发起该下载的应用。其他应用即使注册了这个广播的接收器,也无法收到——这是Android系统的安全设计,目的是防止无关应用获取其他应用的下载行为信息。 - 手动发送的广播(比如adb命令):如果你用
adb shell am broadcast -a android.intent.action.DOWNLOAD_COMPLETE这样的命令发送广播,这属于全局广播,所有注册了该广播接收器的应用都能收到,这就是为什么你的应用能响应adb发送的广播,但收不到Chrome下载时的广播。
3. 为什么Chrome下载时你的应用收不到?
Chrome在处理下载时,要么是使用了自己内部的下载实现(不依赖系统DownloadManager,自然不会触发系统的DOWNLOAD_COMPLETE广播),要么是即使调用了DownloadManager,系统也只会把广播发送给Chrome的包名,你的应用作为第三方无法拦截到这个定向广播。
补充:如果想监听系统内的下载完成事件怎么办?
如果你的需求是监听所有系统内的下载完成事件,DOWNLOAD_COMPLETE这条路走不通。你可以尝试通过DownloadManager的内容提供者(content://downloads/my_downloads)来定时查询下载任务的状态变化,不过这种方式需要申请ACCESS_DOWNLOAD_MANAGER权限,且只能查询到公开的下载任务(部分应用的私有下载可能无法被访问)。
内容的提问来源于stack exchange,提问作者Parteek Dheri
相关产品推荐
相关产品推荐

