本文链接: http://blog.csdn.net/xietansheng/article/details/52513624
在 Android 程序开发中如果需要下载文件,除了自己程序内部实现下载外,还可以直接使用 Android 系统自带的下载器进行下载,使用系统下载器通常有两种方式:
1. 浏览器下载
将下载链接使用浏览器打开,把下载任务交给浏览器,让浏览器调用系统下载器去下载,下载过程在通知栏有下载进度,下载完后文件通常存放在 “外部存储器” 根目录下的 download 文件夹, 也就是: /mnt/sdcard/download
。
打开下载链接的 Intent:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
使用这种方法下载完全把工作交给了系统应用,自己的应用中不需要申请任何权限,方便简单快捷。但如此我们也不能知道下载文件的大小,不能监听下载进度和下载结果。
2. DownloadManager 系统服务
Android 2.3 (API 10) 以后,系统开放了内置下载器服务,也就是 DownloadManager,是专用于处理耗时长的 HTTP 文件下载的系统服务,在后台进行下载,并自动处理网络连接变化,失败重试。
通过 DownloadManager 我们可以在自己的程序中提交下载请求,在通知栏中可以自动显示下载进度展示通知进度条,可以指定下载文件的保存位置,并实时获取下载进度,监听下载结果。
DownloadManager 的实例通过 context.getSystemService(Context.DOWNLOAD_SERVICE)
获取,使用 DownloadManager 还必须要声明网络权限:android.permission.INTERNET
;如果下载文件保存到外部存储器,还需要声明外部存储器的读写权限。
DownloadManager 中有两个重要的内部类:
- 1) DownloadManager.Request :封装一个下载请求添加到系统下载器队列。
- 2) DownloadManager.Query :查询下载任务,可实时获取下载进度,下载结果。
使用步骤:
1、配置权限
在 AndroidManifest.xml 配置权限:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
2、封装下载请求(Request),加入下载队列
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
3、查询下载状态(Query)
添加一个下载请求(Request)到下载管理器的队列中,将返回一个下载ID,通过该ID可以实时查询到下载进度,成功与失败等状态。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
通常如果在自己的应用中需要显示下载进度,可以使用一个定时器,每隔1秒获取一次下载进度,然后根据自己的需求显示在界面上。
4、监听 点击通知 与 下载完成 的广播
上面查询下载状态的方式是自己主动轮询,监听下载完成更好的方式是监听系统下载服务发出的广播,DownloadManager 在用户点击了下载进度的通知栏 和 下载完成后 都会发出相应的广播。
广播实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
在 AndroidManifest.xml 配置广播: