您的位置:首页 > 移动开发 > Android开发

Android使用DownLoadManager(下载管理器)更新版本

2016-09-21 19:16 495 查看

使用DownLoadManager进行下载管理,不再让页面跳转到网页进行下载,而是使用通知栏提示下载进度!!!

1.介绍

                DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager.Request。DownloadManager.Request用来请求一个下载,DownloadManager.Query用来查询下载信息;最近在做版本更新时,无意中在网上看到了DownLoadManager类,一般的方法是获取下载地址,跳转到网页进行下载,然后安装,可是DownLoadManager可以通过通知栏来提示用户下载信息和下载进度,也可以由用户来决定下载完成后是否安装,而且在下载过程中,不会影响用户的其他操作。

2.使用步骤-初始化下载管理器

1.首先通过下面的方式获取DownLoadManager服务:
String serviceString = Context.DOWNLOAD_SERVICE;
downloadManager = (DownloadManager) getSystemService(serviceString);
2.获取要下载的文件的uri地址,并提交下载请求;
Uri uri = Uri.parse("http://download.fir.im/v2/app/install/57a45ae4548b7a37f7000c6b?download_token=3567a3f14a28b90d6ecddec288f61aba");
DownloadManager.Request request = new DownloadManager.Request(uri);
3.设置request的相关属性:
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
//        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DCIM,"huge.jpg");//保存到公共图片文件夹
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "QQ.apk");//公共Download文件夹
request.allowScanningByMediaScanner();//允许被扫描
request.setVisibleInDownloadsUi(true);//通知栏一直显示
request.setTitle("文件下载");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);//下载完成也会持续显示
reference = downloadManager.enqueue(request);//得到下载文件的唯一id
        到这里初始化DownLoadManager就完成了.

3.接收文件下载完成后的广播

要想在下载完成后收到通知,需要注册一个完成的广播:DownloadManager.ACTION_DOWNLOAD_COMPLETE,​接收广播时可以从中获取一个下载的唯一引用,如上面的唯一id,代码如下:
/**
* 接收下载完成后的广播
*/
private void initFinishRecicever() {
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);

receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
long references = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (references == reference) {
Toast.makeText(ScrollingActivity.this, "下载完成", Toast.LENGTH_SHORT).show();
}
}
};
registerReceiver(receiver, intentFilter);
}

4.接收通知栏被点击时的广播

虽然下完成了,但是当我们点击通知栏的时候,应该去安装软件了,这时我们需要为点击通知栏设置一个广播,来监听哪一个下载任务被点击了,从而选择准确的文件进行操作,我们需要注册一个被点击的广播:DownloadManager.ACTION_NOTIFICATION_CLICKED​,完整代码如下:
/**
* 接收通知栏点击后发出的的广播
*/
private void initNotificationClickReceiver() {
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED);
clickedReceiver = 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 refer : references) {
if (refer == reference) {
initDownLoadUri(refer);
if("STATUS_SUCCESSFUL".equals(statusMsg)) {
installFile();
}else{
Toast.makeText(ScrollingActivity.this, "下载还未完成", Toast.LENGTH_SHORT).show();
}
myDownload.close();
}
}
}
};
registerReceiver(clickedReceiver, intentFilter);
}

5.判断当前下载进度

当我们点击通知栏的时候,如果文件还没有下载完成,就会出现文件解析错误,我们需要监听当前下载进度再来决定是否通过点击进行相关操作,通过下面的代码来查询文件下载地址和文件下载状态,
/*** 用户查询文件下载地址的索引*/private Cursor myDownload;
/** * 查询文件下载地址和下载进度 * * @param re */private void initDownLoadUri(long re) { //下载管理查询,得到文件下载地址 DownloadManager.Query myDownloadQuery = new DownloadManager.Query(); myDownloadQuery.setFilterById(re); myDownload = downloadManager.query(myDownloadQuery);// if (myDownload.moveToFirst()) { int fileNameIdx = myDownload.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME); int fileUriIdx = myDownload.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI); //文件名称 /storage/sdcard0/DCIM/huge-5.jpg fileName = myDownload.getString(fileNameIdx); //文件地址 file:///storage/sdcard0/DCIM/huge-5.jpg fileUri = myDownload.getString(fileUriIdx); //得到当前状态 int status = myDownload.getInt(myDownload.getColumnIndex(DownloadManager.COLUMN_STATUS)); switch (status) { case DownloadManager.STATUS_PAUSED: statusMsg = "STATUS_PAUSED"; case DownloadManager.STATUS_PENDING: statusMsg = "STATUS_PENDING"; case DownloadManager.STATUS_RUNNING: statusMsg = "STATUS_RUNNING"; break; case DownloadManager.STATUS_SUCCESSFUL: statusMsg = "STATUS_SUCCESSFUL"; break; case DownloadManager.STATUS_FAILED: statusMsg = "STATUS_FAILED"; break; default: statusMsg = "未知状态"; break; } System.out.println("下载完成" + fileName + ": " + fileUri + "Uri.fromFile(new File(fileName)" + Uri.parse(fileUri)); }}

6.跳转到安装界面进行安装

现在,文件地址也有了,文件下载状态也有了,根据上步得到的文件下载状态,来确定是否安装或者操作,上面第四步时,有一步安装,就是下面的代码:
/*** 跳转到安装界面--安装文件*/private void installFile() {//跳转到安装界面Intent i = new Intent();i.setAction(Intent.ACTION_VIEW);i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);i.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");startActivity(i);}
经过两个早晨的研究,只懂得了这些东西,更深的内容将会在后面不断研究并添加进来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: