下文是从http://blog.csdn.net/gf771115/article/details/7019033和http://blog.csdn.net/frdde/article/details/7321225整合而来,以便可以更清晰的熟悉DownloadManager。

DownloadManager下载管理类2.3新增API介绍

作者: Android开发网原创 时间: 2010-12-11

从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到。下载管理类可以长期处理多 个HTTP下载任务,客户端只需要给出请求的Uri和存放目标文件的位置即可,下载管理使用了一个AIDL服务器所以可以放心的在后台执行,同时实例化的 方法需要使用getSystemService(Context.DOWNLOAD_SERVICE) ,Android123再次提醒使用API Level为9的用户可以轻松的通过新增的这个API实现Android平台上的文件下载操作。

DownloadManager类提供了以下几种方法来处理,

long enqueue(DownloadManager.Request request) //存入队列一个新的下载项

ParcelFileDescriptor openDownloadedFile(long id) //打开一个下载后的文件用于读取,参数中的long型id是一个provider中的一条记录。

Cursor query(DownloadManager.Query query) //查询一个下载,返回一个Cursor

int remove(long... ids) //取消下载同时移除这些条从下载管理中。

我们可以看到提供的方法都比较简单,给我们操作的最终封装成为一个provider数据库的方式进行添加、查询和移除,但是对于查询和添加任务的细节,我们要看看DownloadManager.Request类和DownloadManager.Query 类了。

一、DownloadManager.Request类的成员和定义

DownloadManager.Request addRequestHeader(String header, String value) // 添加一个Http请求报头,对于这两个参数,Android开发网给大家举个小例子,比如说User-Agent值可以为Android123或 Windows XP等等了,主要是给服务器提供标识。
DownloadManager.Request setAllowedNetworkTypes(int flags) //设置允许使用的网络类型,这一步Android 2.3做的很好,目前有两种定义分别为NETWORK_MOBILE和NETWORK_WIFI我们可以选择使用移动网络或Wifi方式来下载。
DownloadManager.Request setAllowedOverRoaming(boolean allowed) //对于下载,考虑到流量费用,这里是否允许使用漫游。
DownloadManager.Request setDescription(CharSequence description) //设置一个描述信息,主要是最终显示的notification提示,可以随便写个自己区别
DownloadManager.Request setDestinationInExternalFilesDir(Context context, String dirType, String subPath) //设置目标存储在外部目录,一般位置可以用 getExternalFilesDir()方法获取。
DownloadManager.Request setDestinationInExternalPublicDir(String dirType, String subPath) //设置外部存储的公共目录,一般通过getExternalStoragePublicDirectory()方法获取。
DownloadManager.Request setDestinationUri(Uri uri) //设置需要下载目标的Uri,可以是http、ftp等等了。
DownloadManager.Request setMimeType(String mimeType) //设置mime类型,这里看服务器配置,一般国家化的都为utf-8编码。
DownloadManager.Request setShowRunningNotification(boolean show) //是否显示下载进度的提示
DownloadManager.Request setTitle(CharSequence title) //设置notification的标题
DownloadManager.Request setVisibleInDownloadsUi(boolean isVisible) //设置下载管理类在处理过程中的界面是否显示

当然了Google还提供了一个简单的方法来实例化本类,这个构造方法为DownloadManager.Request(Uri uri) ,我们直接填写一个Uri即可,上面的设置使用默认情况。

二、DownloadManager.Query类

对于当前下载内容的状态,我们可以使用DownloadManager.Query类来获取,本类比较简单,仅仅提供了两个方法。

DownloadManager.Query setFilterById(long... ids) //根据id来过滤查找。
DownloadManager.Query setFilterByStatus(int flags) //根据任务的状态来查找。

详细的状态在android.app.DownloadManager类中有定义,目前Android 2.3中的定义为:

int STATUS_FAILED 失败
int STATUS_PAUSED 暂停
int STATUS_PENDING 等待将开始
int STATUS_RUNNING 正在处理中
int STATUS_SUCCESSFUL 已经下载成功

最后Android开发网提醒大家要说的是因为DownloadManager类提供的query方法返回一个Cursor对象,这些状态保存在这个游标的COLUMN_STATUS 字段中。

1. 下载的状态完成均是以广播的形式通知大家,目前API Level为9定义了下面三种Intent的action

ACTION_DOWNLOAD_COMPLETE下载完成的动作。
ACTION_NOTIFICATION_CLICKED 当用户单击notification中下载管理的某项时触发。
ACTION_VIEW_DOWNLOADS 查看下载项

2. 对于一个尚未完成的项,在Cursor中我们查找COLUMN_REASON字段,可能有以下定义:

int ERROR_CANNOT_RESUME 不能够继续,由于一些其他原因。
int ERROR_DEVICE_NOT_FOUND 外部存储设备没有找到,比如SD卡没有插入。
int ERROR_FILE_ALREADY_EXISTS 要下载的文件已经存在了,Android123提示下载管理类是不会覆盖已经存在的文件,所以如果需要重新下载,请先删除以前的文件。

int ERROR_FILE_ERROR 可能由于SD卡原因导致了文件错误。
int ERROR_HTTP_DATA_ERROR 在Http传输过程中出现了问题。
int ERROR_INSUFFICIENT_SPACE 由于SD卡空间不足造成的

int ERROR_TOO_MANY_REDIRECTS 这个Http有太多的重定向,导致无法正常下载
int ERROR_UNHANDLED_HTTP_CODE 无法获取http出错的原因,比如说远程服务器没有响应。
int ERROR_UNKNOWN 未知的错误类型.

3. 有关暂停的一些状态,同样COLUMN_REASON字段的值可能是以下定义

int PAUSED_QUEUED_FOR_WIFI 由于移动网络数据问题,等待WiFi连接能用后再重新进入下载队列。
int PAUSED_UNKNOWN 未知原因导致了任务下载的暂停.
int PAUSED_WAITING_FOR_NETWORK 可能由于没有网络连接而无法下载,等待有可用的网络连接恢复。.
int PAUSED_WAITING_TO_RETRY 由于重重原因导致下载暂停,等待重试。

有关Android 2.3中新增的下载管理DownloadManager的介绍基本上已经完全讲完,如果你对Cursor、Provider这些基础概念了解的话,可以看到这个下载管理类可以帮我们减少很多不必要的代码编写。

小例子如下:

于是有了下面的小例子:


代码如下:

Java代码
  1. publicclassApkClientActivityextendsActivity{
  2. staticfinalStringTAG="ApkClientActivity";
  3. ContextmContext;
  4. DownloadManagermanager;
  5. DownloadCompleteReceiverreceiver;
  6. ButtondownBtn;
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. mContext=this;
  12. //获取下载服务
  13. manager=(DownloadManager)getSystemService(DOWNLOAD_SERVICE);
  14. receiver=newDownloadCompleteReceiver();
  15. downBtn=(Button)findViewById(R.id.downBtn);
  16. downBtn.setOnClickListener(newOnClickListener(){
  17. @Override
  18. publicvoidonClick(Viewv){
  19. //创建下载请求
  20. DownloadManager.Requestdown=newDownloadManager.Request(Uri.parse("http://192.168.0.66:8080/qqinput.apk"));
  21. //设置允许使用的网络类型,这里是移动网络和wifi都可以
  22. down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);
  23. //禁止发出通知,既后台下载
  24. down.setShowRunningNotification(false);
  25. //不显示下载界面
  26. down.setVisibleInDownloadsUi(false);
  27. //设置下载后文件存放的位置
  28. down.setDestinationInExternalFilesDir(mContext,null,"qqinput.apk");
  29. //将下载请求放入队列
  30. manager.enqueue(down);
  31. }
  32. });
  33. }
  34. //接受下载完成后的intent
  35. classDownloadCompleteReceiverextendsBroadcastReceiver{
  36. @Override
  37. publicvoidonReceive(Contextcontext,Intentintent){
  38. if(intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)){
  39. longdownId=intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,-1);
  40. Log.v(TAG,"downloadcomplete!id:"+downId);
  41. Toast.makeText(context,intent.getAction()+"id:"+downId,Toast.LENGTH_SHORT).show();
  42. }
  43. }
  44. }
  45. @Override
  46. protectedvoidonResume(){
  47. registerReceiver(receiver,newIntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
  48. super.onResume();
  49. }
  50. @Override
  51. protectedvoidonDestroy(){
  52. if(receiver!=null)unregisterReceiver(receiver);
  53. super.onDestroy();
  54. }
  55. }

其中在设置 down.setShowRunningNotification(false);时,需要添加相应的权限:

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />

否则,会报错!

AndroidManifest.xml文件内容如下:

Xml代码
  1. <strong><uses-sdkandroid:minSdkVersion="9"/></strong>
  2. <application
  3. android:icon="@drawable/ic_launcher"
  4. android:label="@string/app_name">
  5. <activity
  6. android:label="@string/app_name"
  7. android:name=".ApkClientActivity">
  8. <intent-filter>
  9. <actionandroid:name="android.intent.action.MAIN"/>
  10. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  11. </intent-filter>
  12. </activity>
  13. </application>
  14. <uses-permissionandroid:name="android.permission.INTERNET"/>
  15. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  16. <uses-permissionandroid:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>

因为这个DownloadManager是android2.3才提供的,所以minSdkVersion = 9

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android(安卓)stutdio2.2 启动模拟器出现“/dev/kvm is not foun
  6. 【OkHttp3源代码分析】(一)Request的execute
  7. Android(安卓)Launcher 详解
  8. 【Android(安卓)开发教程】重写onKeyDown()
  9. 自定义Android的Dialog

随机推荐

  1. Android开发常用命令行
  2. Android studio 使用问题
  3. Android Gradle Task依赖
  4. Android 调用相机和调用图库
  5. 『ANDROID』Android实现圆形的图片边角
  6. Android(安卓)ANR keyDispatchingTimedOu
  7. 使用http协议获取网络图片
  8. android 导入第三方库出现java.lang.NoCl
  9. java.util.concurrent.ExecutionExceptio
  10. Android 安装apk的方法