DownLoadManager 使用
DownLoadManager 通过service来优化长时间下载操作的处理,通过处理http连接、监控连接的变化和系统重启来确保每一次下载都能成功完成,我们通过这个服务完成文件下载。整个下载 过程全部交给系统负责,不需要我们过多的处理。
DownLoadManager包含两个内部类:
DownLoadManager.Query:主要用于查询下载信息。
DownLoadManager.Request:主要用于发起一个下载请求。
DownLoadManager 用法
DownloadManager dm= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri=Uri.parse("http://113.207.4.45/apk.r1.market.hiapk.com/data/upload/apkres/2016/8_19/12/com.hiapk.live_122502.apk?wsiphost=local");
DownloadManager.Request request=new DownloadManager.Request(uri);
1、构造完对象后,我们可以为request设置一些属性:
- addRequestHeader(String header,String value):添加网络下载请求的http头信息
- allowScanningByMediaScanner():用于设置是否允许本MediaScanner扫描。
- setAllowedNetworkTypes(int flags):设置用于下载时的网络类型,默认任何网络都可以下载,提供的网络常量有:NETWORK_BLUETOOTH、NETWORK_MOBILE、NETWORK_WIFI。
- setAllowedOverRoaming(Boolean allowed):用于设置漫游状态下是否可以下载
- setNotificationVisibility(int visibility):用于设置下载时时候在状态栏显示通知信息
- setTitle(CharSequence):设置Notification的title信息
- setDescription(CharSequence):设置Notification的message信息
- setDestinationInExternalFilesDir、setDestinationInExternalPublicDir、
setDestinationUri等方法用于设置下载文件的存放路径,注意如果将下载文件存放在默认路径,那么在空间不足的情况下系统会将文件删除,所 以使用上述方法设置文件存放目录是十分必要的。
若想取消下载,则调用remove()方法,之后会删除下载任务并且删除下载的文件
dm.remove();
2、下载完成之后系统会发出一个ACTION_DOWNLOAD_COMPLETE的广播,它包含一个EXTRA_DOWNLOAD_ID参数的值,这个值是完成下载的引用ID
//接收下载完成广播
IntentFilter intentFilter=new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
receiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
long id =intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,-1);
if (myreference!=id){
return;
}
DownloadManager.Query query=new DownloadManager.Query();
query.setFilterById(id);//通过ID在刚刚下载的队列中查找
Cursor c=dm.query(query);
while (c.moveToNext()){
int columnIndex =c.getColumnIndex(DownloadManager.COLUMN_STATUS);
//获取下载状态,因为错误也会发送这个广播,所以要判断是否下载成功
if (DownloadManager.STATUS_SUCCESSFUL!=c.getInt(columnIndex)){
return;
}
String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
// 提示用户安装
promptInstall(Uri.parse("file://" + uriString));
}
}
};
也可以监听ACTION_NOTIFICATION_CLICKED这个广播,当用户从通知栏或者下载管理器的应用中选择一个下载时,系统就会发出这个广播
IntentFilter intentFilter=new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED);
BroadcastReceiver receiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String extrID = DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS;
long reference[] = intent.getLongArrayExtra(extrID);
for (long l: reference) {
if (l==myreference){
System.out.println(l);
((DownloadManager)getSystemService(DOWNLOAD_SERVICE)).remove(myreference);
Toast.makeText(MainActivity.this,"开始下载",Toast.LENGTH_LONG).show();
}
}
}
};
3、DownManager会对所有的现在任务进行保存管理,那么我们如何获取这些信息呢?这个时候就要用到DownManager.Query对象,通过此对象,我们可以查询所有下载任务信息
private void promptInstall(Uri data) {
Intent promptInstall = new Intent(Intent.ACTION_VIEW)
.setDataAndType(data, "application/vnd.android.package-archive");
// FLAG_ACTIVITY_NEW_TASK 可以保证安装成功时可以正常打开 app
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(promptInstall);
}
//亲测可实现
4、自定义下载通知管理器
//使用request可以为每个下载请求自定义通知栏
request.setTite() //自定义标题
request.setDescription(); //自定义描述
request.setNotificationVisibiity() //控制何时显示以及是否应该为请求显示通知栏