DownloadManager - Part2

原文地址:https://blog.stylingandroid.com/downloadmanager-part-2/

上一篇文章我们看了一下如何使用DownloadManager来执行下载的操作,还有更多的东西需要我们去发觉,所以在这篇文章中我们将去看一下。

当我们下载的时候,会发现出现了一个Notification,我们可以看到下载的进度和下载的文件名以及下载所预计的时间。


DownloadManager - Part2_第1张图片
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);
        }
    }

尽量避免修改描述字段,因为剩余下载时间对于用户来说还是非常有用的,但是我们运行之后,可以看到如何更改通知。


DownloadManager - Part2_第2张图片
图片

通常服务器可能需要包括特定的Http头,例如会话ID,这个可以轻松的通过调用DownloadManager.Request的addRequestHeader()来实现。

如果下载量特别大的话,那么我们需要考虑下载对用户的手机流量的影响,在DownloadManager.Request上有一些方法可以限制用户下载的网络,以免对用户造成金钱上的浪费,默认的设置是没有限制的,所以加这个限制是非常重要的,漫游时下载可以使用setAllowedOverRoaming()来限制,特定类型的网络可以使用setAllowedNetworkTypes来限制(在Api16以上,我们可以使用setAllowedOverMetered).

我们还可以控制下载后的内容对操作系统可见,在我们将请求加入队列之前,调用allowScanningByMediaScanner()将允许系统媒体扫描可见内容,例如,如果我们在下载图片时设置这一点,那么当图片下载完之后,图片扫描器将会扫描到该图片,图片也将会出现在图片库中。

我们控制内容是否可见的另外一种方法DownloadManager.RequestsetVisibleInDownloadsUi(),这将控制所下载的内容及其状态是否在系统下载应用程序中可见。

最后,我们可以控制内容的下载位置,默认情况下他将被下载到默认系统区域,但是缺点是,他可以被系统删除,如果系统需要释放内存空间的话,为了避免这种潜在的风险,可以调用setDestinationInExternalFilesDir(),他会将下载内容存储到应用程序的私有存储区中的外部存储,这个对媒体扫描器通常是不可见的,如果你希望对媒体扫描器可见的话,那么需要调用setDestinationInExternalPublicDir(),这将会把下载内容保存到外部存储区域,但是保存在外部公共存储会影响与其他应用程序共享的能力,更多的将会在下一篇文章中描述。

我们可以在每次下载的基础上控制所有这些,单也有一些一般的限制,我们可以应用于所有的下载,但是这个将会在下一篇文章中描述。

你可能感兴趣的:(DownloadManager - Part2)