原文地址:https://blog.stylingandroid.com/downloadmanager-part-2/
上一篇文章我们看了一下如何使用DownloadManager来执行下载的操作,还有更多的东西需要我们去发觉,所以在这篇文章中我们将去看一下。
当我们下载的时候,会发现出现了一个Notification,我们可以看到下载的进度和下载的文件名以及下载所预计的时间。
default_notification.png
我们可以控制通知,如果我们想要在显示通知时进行更改的话,我们可以在通过DownloadManager.Request
对象上调用setNotificationVisibility()
(对于API11或者更高版本,或者API9可以调用setShowRunningNotification()
),可以完全取消通知,但是必须拥有DOWNLOAD_WITHOUT_NOTIFICATION
权限才能这么做。
但是也可以使用DownloadManager.Request中的setDescription()
和setTitle()
方法来控制通知中显示的内容。setTitle允许更改文件显示的名字,setDescription允许我们修改剩余下载时间所显示的内容。
void download(Uri uri) {
if (!isDownloading()) {
register();
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setTitle("My hovercraft is full of eels");
request.setDescription("I am no longer infected");
downloadId = downloadManager.enqueue(request);
}
}
尽量避免修改描述字段,因为剩余下载时间对于用户来说还是非常有用的,但是我们运行之后,可以看到如何更改通知。
图片
通常服务器可能需要包括特定的Http头,例如会话ID,这个可以轻松的通过调用DownloadManager.Request的addRequestHeader()
来实现。
如果下载量特别大的话,那么我们需要考虑下载对用户的手机流量的影响,在DownloadManager.Request上有一些方法可以限制用户下载的网络,以免对用户造成金钱上的浪费,默认的设置是没有限制的,所以加这个限制是非常重要的,漫游时下载可以使用setAllowedOverRoaming()
来限制,特定类型的网络可以使用setAllowedNetworkTypes
来限制(在Api16以上,我们可以使用setAllowedOverMetered
).
我们还可以控制下载后的内容对操作系统可见,在我们将请求加入队列之前,调用allowScanningByMediaScanner()
将允许系统媒体扫描可见内容,例如,如果我们在下载图片时设置这一点,那么当图片下载完之后,图片扫描器将会扫描到该图片,图片也将会出现在图片库中。
我们控制内容是否可见的另外一种方法DownloadManager.Request
的setVisibleInDownloadsUi()
,这将控制所下载的内容及其状态是否在系统下载应用程序中可见。
最后,我们可以控制内容的下载位置,默认情况下他将被下载到默认系统区域,但是缺点是,他可以被系统删除,如果系统需要释放内存空间的话,为了避免这种潜在的风险,可以调用setDestinationInExternalFilesDir()
,他会将下载内容存储到应用程序的私有存储区中的外部存储,这个对媒体扫描器通常是不可见的,如果你希望对媒体扫描器可见的话,那么需要调用setDestinationInExternalPublicDir()
,这将会把下载内容保存到外部存储区域,但是保存在外部公共存储会影响与其他应用程序共享的能力,更多的将会在下一篇文章中描述。
我们可以在每次下载的基础上控制所有这些,单也有一些一般的限制,我们可以应用于所有的下载,但是这个将会在下一篇文章中描述。
网友评论