DownLoadManager 的使用

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_BLUETOOTHNETWORK_MOBILENETWORK_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() //控制何时显示以及是否应该为请求显示通知栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值