在android开发中,经常会使用到文件下载的功能,比如app版本更新等。在api level 9之后,android系统为我们提供了DownLoadManager类,这是android提供的系统服务,我们通过这个服务完成文件下载。整个下载 过程全部交给系统负责,不需要我们过多的处理。
通过API文档,可以看出DownLoadManager包含两个内部类:
DownLoadManager.Query:主要用于查询下载信息。
DownLoadManager.Request:主要用于发起一个下载请求。
首先让我们来了解一下DownLoadManager.Request,此类封装了一个下载请求所需要的所有信息。通过构造函数我们可以初始化一个request对象,构造对象时需要传入下载文件的地址。
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("下载地址"));
让我们看看DownloadManager的源码,提供了这么多方法
方法差不多就这些,已经比较全了,可以满足我们绝大部分的使用场景。
实际使用
接下来我们就以APP应用内更新为例,讲一下这些方法的使用
1.首先我们梳理下APP应用内更新的逻辑
接下来看具体实现,上代码
private void downLoadApk() {
//创建request对象
DownloadManager.Request request=new DownloadManager.Request(Uri.parse("http://gdown.baidu/data/wisegame/55dc62995fe9ba82/jinritoutiao_448.apk"));
//设置什么网络情况下可以下载
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
//设置通知栏的标题
request.setTitle("下载");
//设置通知栏的message
request.setDescription("今日头条正在下载.....");
//设置漫游状态下是否可以下载
request.setAllowedOverRoaming(false);
//设置文件存放目录
request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS,"update.apk");
//获取系统服务
downloadManager= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
//进行下载
id = downloadManager.enqueue(request);
}
如果想取消下载,则可以调用remove方法完成,此方法可以将下载任务和已经下载的文件同时删除:
downManager.remove(id);
在文件下载完成时,我们经常需要做下载后操作,比如apk,需要直接显示安装,那么我们如何监听文件已经下载完成了 呢?DownLoadManager在文件完成时会发送一个action为ACTION_DOWNLOAD_COMPLETE的广播,我们只要注册一 个广播接收器即可进行处理:
/**
* Created by YuShuangPing on 2018/9/4.
*/
public class DownLoadCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())){
//在广播中取出下载任务的id
long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
Toast.makeText(context, "编号:"+id+"的下载任务已经完成!", Toast.LENGTH_SHORT).show();
DownloadManager.Query query=new DownloadManager.Query();
DownloadManager dm= (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
query.setFilterById(id);
Cursor c = dm.query(query);
if (c!=null){
try {
if (c.moveToFirst()){
//获取文件下载路径
String filename= c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
int status = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
if (status==DownloadManager.STATUS_SUCCESSFUL){
//启动更新
Uri uri = Uri.fromFile(new File(filename));
if (uri!=null){
Intent install=new Intent(Intent.ACTION_VIEW);
install.setDataAndType(uri,"application/vnd.android.package-archive");
install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(install);
}
}
}
}catch (Exception e){
e.printStackTrace();
return;
}finally {
c.close();
}
}
}
}
}
在清单文件中注册广播:
<receiver android:name=".receiver.DownLoadCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
</intent-filter>
</receiver>
等下载完时就会自动跳到安装界面:
更多推荐
Android基于自带的DownloadManager实现下载功能
发布评论