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


使用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);
}

经过两个早晨的研究,只懂得了这些东西,更深的内容将会在后面不断研究并添加进来。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值