Android中使用DownloadManager类来管理数据下载的教程

2019-12-10 18:07:49丽君

我们还可以指定在什么连接状态下执行下载操作。setAllowedNetworkTypes方法可以用来限定在WiFi还是手机网络下进行下载,setAllowedOverRoaming方法
可以用来阻止手机在漫游状态下下载。
下面的代码片段用于指定一个较大的文件只能在WiFi下进行下载:

request.setAllowedNetworkTypes(Request.NETWORK_WIFI); 

Android API level 11 介绍了getRecommendedMaxBytesOverMobile类方法(静态方法),返回一个当前手机网络连接下的最大建议字节数,可以来判断下载
是否应该限定在WiFi条件下。
调用enqueue方法之后,只要数据连接可用并且Download Manager可用,下载就会开始。
要在下载完成的时候获得一个系统通知(notification),注册一个广播接受者来接收ACTION_DOWNLOAD_COMPLETE广播,这个广播会包含一个
EXTRA_DOWNLOAD_ID信息在intent中包含了已经完成的这个下载的ID,代码片段如下所示:

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 
  
BroadcastReceiver receiver = new BroadcastReceiver() { 
 @Override 
 public void onReceive(Context context, Intent intent) { 
 long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
 if (myDownloadReference == reference) { 
  
 } 
 } 
}; 
registerReceiver(receiver, filter); 

使用Download Manager的openDownloadedFile方法可以打开一个已经下载完成的文件,返回一个ParcelFileDescriptor对象。我们可以通过Download Manager来查询下载文件的保存地址,如果在下载时制定了路径和文件名,我们也可以直接操作文件。
我们可以为ACTION_NOTIFICATION_CLICKED action注册一个广播接受者,当用户从通知栏点击了一个下载项目或者从Downloads app点击可一个下载的项目的
时候,系统就会发出一个点击下载项的广播。
代码片段如下:

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED); 
 
BroadcastReceiver receiver = new BroadcastReceiver() { 
 @Override 
 public void onReceive(Context context, Intent intent) { 
 String extraID = DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS; 
 long[] references = intent.getLongArrayExtra(extraID); 
 for (long reference : references) 
  if (reference == myDownloadReference) { 
  // Do something with downloading file. 
  } 
 } 
}; 
 
registerReceiver(receiver, filter);