我正在查看KitKat中的AOSP代码并在com.android.providers.downloads.DownloadThread
注意到这段代码:
/**
* Stores information about the completed download, and notifies the initiating application.
*/
private void notifyDownloadCompleted(
State state, int finalStatus, String errorMsg, int numFailed) {
notifyThroughDatabase(state, finalStatus, errorMsg, numFailed);
if (Downloads.Impl.isStatusCompleted(finalStatus)) {
mInfo.sendIntentIfRequested();
}
}
奇怪的是,我发现它不会因STATUS_INSUFFICIENT_SPACE_ERROR
广播失败,因为值为198并且状态检查已完成排除android.provider.Downloads
中小于200的值:
public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 198;
// ...
public static boolean isStatusCompleted(int status) {
return (status >= 200 && status < 300) || (status >= 400 && status < 600);
}
我看到这段代码似乎可以防止由于空间不足导致下载失败。见com.android.providers.downloads.DownloadInfo
:
case Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR:
// avoids repetition of retrying download
return false;
因此,如果由于空间不足导致下载失败,则不会发生广播,也不会重试。是对的吗?我还没有查看其他版本的AOSP,看看它们是否以相同的方式运行。
总之,似乎有兴趣收到下载成功或失败的通知的人不仅需要注册广播,还需要使用ContentObserver来观看下载ContentProvider的更改。