DownloadManager使用流程错误导致的无法找到下载完成的文件
- 1. 问题描述
- 2. 问题解决
- 3. 解决后的思考
- 5. 场景利用
1. 问题描述
先提交 enqueue 请求,后配置
DownloadManager.Request(parseUri).also {
refId = downloadManagerService.enqueue(it)
it.apply {
setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
setTitle(name)
setDescription("DDay Update Downloading...")
setAllowedOverRoaming(false)
setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,
appContext.packageName+ "/"+ name
)
setVisibleInDownloadsUi(true)
}
}
2. 问题解决
当然是配置好后再提交请求
DownloadManager.Request(parseUri).also {
refId = downloadManagerService.enqueue(it)
it.apply {
setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
setTitle(name)
setDescription("DDay Update Downloading...")
setAllowedOverRoaming(false)
setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,
appContext.packageName+ "/"+ name
)
setVisibleInDownloadsUi(true)
}
refId = downloadManagerService.enqueue(it)
}
3. 解决后的思考
本身问题很简单,正常逻辑都是:配置好请求后,提交到请求队列,等待DownloadManager这个SystemService执行需要的请求
问题在于,在我的OPPO测试机器上,先enqueue提交请求,然后再配置是有效的
在其他机型是无效的
导致:
- 由于DownlaodManager是跨线程的SystemService,一开始不注意很难排查到这个基本逻辑错误
5. 场景利用
可利用的地方有两点:
- 可以提交未配置的 DownloadManager.Request ,执行一些 只用下载后马上删除的任务,来达到某种需求
- OPPO android oem 对DownloadManager这种跨进程服务,在提交 Request却仍然可以配置对应的对象并影响到对应DownloadManager的行为,是否说明:OPPO的某些行为导致 进程共享某些数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)