我有一个用例,其中
我开始使用android下载管理器下载一个文件,并在中间关闭了手机。当我再次重新启动时,下载继续并完成。我通过提供下载参考id获得了状态。但即使在使用该参考id 10天后,我也想知道状态。
所以我的问题是,直到android下载管理器何时会通过下载参考Id给出下载状态?
我查阅了文档,浏览了一遍堆叠流程,但找不到答案。有人帮我。
AndroidDownloaderManager
是一项系统服务。它应该一直在运行。但在某些情况下,它无法运行。
下载通过HTTP持久连接进行。这意味着相同的已建立连接用于连续的HTTP请求/响应。连接中断意味着发生错误,因此,您无法通过参考id跟踪状态。
您通过AndroidDownloadManager
服务进行跟踪,其中AndroidDownloadManager
服务从服务器获取STATUS
代码。
Android下载管理器使用基于content-length
的服务器下载。Content-Length
标头将不允许流式传输(链接)。基于内容长度的下载具有恢复、暂停、部分下载的优点——请参阅上面的链接1。因此,即使重新启动系统,它也会重新启动(增量)下载。
基于content-length
的下载是store and forward
(链接)。您应该将缓冲的内容转发到持久存储,因为您的固定缓冲区有限。
AndroidDownloadManager
具有ERROR_CANNOT_RESUME int
标志(链接)。CCD_ 11是基于CCD_。COLUMN STATUS有两种类型:STATUS_PAUSED
或STATUS_FAILED
。在系统关闭前,系统通过BroadcastReceiver
向安卓DownloadManager
发送关于关闭的服务,安卓DownloadManager
激活STATUS_PAUSED
标志。并且,下次重新启动设备时,系统服务会自动运行,检查STATUS_PAUSED是否再次开始下载。
答案:因此,在出现错误(在客户端、连接或服务器端)或您没有完成文件下载(意味着直到STATUS_SUCCESSFUL
)之前,您将一直从AndroidDownloadManager
获取状态。当发生STATUS_FAILED
时,您无法获得状态——它表示不会重试下载(链接)。
STATUS_FAILED
是如何发生的?客户端的DownloadManager
服务检测到HTTP状态代码4XX(服务器猜测客户端出错)和5XX(服务器检测服务器出错)(链接),现在STATUS_FAILED
变为true。
其他一些情况:当客户端一直处于关闭状态并且基于服务器逻辑时,服务器可以在超时时终止连接。因此,此控件显式地基于不同的HTTP服务器。我们不能在这里问这么多天。我们不知道服务器端的逻辑。状态代码基于服务器。当服务器决定客户端失败时,服务器执行timeout
连接,使STATUS_FAILED
在服务器端处于活动状态。客户端必须为TCP连接在任意时间消失做好准备,并且必须能够重新建立连接并重试HTTP请求。过早关闭的连接不应被视为错误;只有在重新建立连接的尝试失败时才会发出错误信号。你的问题没有确切的答案
注意:TCP connections to disappear at arbitrary times
(链接)是此处的主要逻辑,可以在设备关闭一定天数后恢复连接。
1) 在STATUS_FAILED
上,您无法继续跟踪更多数据。
2) 在上,如果COLUMN_STATUS
既不是STATUS_FAILED
也不是STATUS_PAUSED
,则此列的值未定义,因此您可能无法跟踪更多数据。
-除上述两种情况外的任何情况,下载都在进行中
您可以使用SharedPreferences来存储您的下载参考ID。类似这样的东西-
SharedPreferences settings = getSharedPreferences("DownloadIDS", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putLong("downloadIds", downloadID);
editor.commit();
您可以稍后使用此检索ID
SharedPreferences downloadids = context.getSharedPreferences("DownloadIDS", 0);
long savedDownloadIds = downloadids.getLong("downloadIds", 0);