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是一个明确的广播而不是一个隐含的广播?我的接收器仍然接收该广播的任何想法?
这是我在深入挖掘平台源代码后发现的:
1)当我们实例化DownloadManager时,它会保留对应用程序上下文的引用,并从该上下文中提取应用程序的包名称
2)Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE在请求下载时,将包名称插入到下载数据库中
3)下载完成后,DownloadInfo.sendIntentIfRequested()方法将调用传递包名称的Intent.setPackage().根据方法Intent.setPackage()的描述:
(通常是可选的)设置显式应用程序包名称,以限制此Intent将解析的组件.如果保留默认值null,则将考虑所有应用程序中的所有组件.如果为非null,则Intent只能匹配给定应用程序包中的组件.
基于该描述,我的理解是广播意图将针对我的应用程序,因此作为明确的意图.
| 归档时间: |
|
| 查看次数: |
568 次 |
| 最近记录: |