首先该管理者适用于处理长时间的下载操作,支持断点续传下载。主要应用于版本更新,音频文件下载。
通过上下文获取对象。
<span style="font-family:SimSun;font-size:12px;background-color: rgb(255, 255, 204);">DownloadManager downloadManager;
downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); </span>
要下载文件先获取DownloadManager .Rquest对象,把要下载的uri在创建rquest时传递过去:
<span style="font-family:SimSun;font-size:12px;background-color: rgb(255, 255, 204);">Uri uri = Uri.parse(apkUrl); //apkUrl为更新apk的下载地址</span>
<span style="font-family:SimSun;font-size:12px;background-color: rgb(255, 255, 204);">DownloadManager.Request request = new Request(uri);
long downloadId= downloadManager.enqueue(request); </span>
返回的long值为downloadManager下载管理的唯一Id,可以通过该id获取下载路径,和删除下载任务。
<span style="font-family:SimSun;font-size:12px;background-color: rgb(255, 255, 204);"> downloadManager.remove(downloadId);
Uri uri= downloadManager.getUriForDownloadedFile(downloadId);</span>
DownloadManager .Rques还可以对下载进行一些设置
<span style="font-family:SimSun;font-size:12px;background-color: rgb(255, 255, 204);">request.allowScanningByMediaScanner();//表示允许MediaScanner扫描到这个文件,默认不允许。
request.setTitle(“下载标题”);//设置下载中通知栏提示的标题
request.setDescription(“下载详情”);//设置下载中通知栏提示的介绍
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//表示下载进行中和下载完成的通知栏是否显示。默认只显示下载中通知。</span>
<span style="color: rgb(68, 68, 68); line-height: 24px; background-color: rgb(255, 255, 204);"><span style="font-family:SimSun;font-size:12px;">VISIBILITY_HIDDEN表示不显示任何通知栏提示,这个需要在AndroidMainfest中添加权限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION.</span></span>
进行这些设置以后再通知栏就可以看到下载的详细信息,和进度条的显示。
request.setAllowedNetworkTypes(Request.NETWORK_WIFI); //仅在wifi环境下可以下载
下面是监听下载变化,可以建立个子线程每3秒调用监听一次,更新自定义精度条
public int[] getBytesAndStatus(long downloadId) {//这时监听下载变化
int[] bytesAndStatus = new int[] { -1, -1 };
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = null;
try {
c = downloadManager.query(query);
if (c != null && c.moveToFirst()) {
//当前下载长度
bytesAndStatus[0] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
//总字节长度
bytesAndStatus[1] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
}
} finally {
if (c != null) {
c.close();
}
}
下面是下载成功后广播接收,在添加下载任务的时候就要注册该广播,界面销毁时记得取消注册广播。
public class DownloadReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 获取下载完成的loadId
long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
// 判断
long downloadId=Long.parseLong(SharedUtil.getString(context, Constant.NEW_VERSION_DOWNLOADID));
if(downloadId==completeDownloadId){
DownloadUtil.isdown=false;
DownloadManager downloadManager = (DownloadManager)context.getSystemService(context.DOWNLOAD_SERVICE);
Uri uri= downloadManager.getUriForDownloadedFile(downloadId);
LogUtil.e(uri.toString());
//创建Intent意图
Intent inten=new Intent(Intent.ACTION_VIEW);
intent.setFlags(inten.FLAG_ACTIVITY_NEW_TASK);//启动新的activity
//设置Uri和类型
inten.setDataAndType( uri, "application/vnd.android.package-archive");
//执行安装
context.startActivity(intent);
}}
}