Android APP更新下载工具类——简单封装DownloadManager

几乎所有APP都包含了检查更新功能,更新下载功能的实现方式常用的有两种:1、使用App网络框架的文件下载请求;2、使用自带的DownloadManager类;本文介绍第二种,简单封装一下DownloadManager进行下载更新。


重要声明:
本文严格意义上来说并非原创,参考了网上一些文章,他们写的都很好,博主只是按照自己的习惯再次封装一遍,方便自己使用,在此发出只供大家分享指教


参考文章:CSDN——http://blog.csdn.net/sir_zeng/article/details/8983430

                   简书——http://www.jianshu.com/p/7ad92b3d9069

正文:

在此不对DownloadManager做解释,请参考上边两篇文章

1、初始化

DownloadManager downloadManager;
/**
 * 初始化downloadManager
 */
private void getService() {
    String serviceString = Context.DOWNLOAD_SERVICE;
    downloadManager = (DownloadManager) context.getSystemService(serviceString);
}

2、发起下载任务,主要是对DownloadManager.Request request 对象进行配置

List<Long> downloadIds;//记录所有下载任务id

/** * @param uil 下载地址 
  * @param title 通知栏标题
 * @param description 描述
 * @return */ 
public long download(String uil, String title, String description) {
 Uri uri = Uri.parse(uil);
 DownloadManager.Request request = new DownloadManager.Request(uri);//设置下载地址
 request.setTitle(title);//设置Notification的title信息
 request.setDescription(description);//设置Notification的message信息
 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);//设置通知栏下载通知显示状态
 //下载到download文件夹下 
  request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "update.apk");
 //只能在WiFi下进行下载
 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
 //reference变量是系统为当前的下载请求分配的一个唯一的ID,我们可以通过这个ID重新获得这个下载任务,进行一些自己想要进行的操作或者查询
 long id = downloadManager.enqueue(request);
 downloadIds.add(id);
 return id; 
}

3、辅助方法 判断下载组件是否可以 和 开启下载组件


/**
     * 判断下载组件是否可用
     *
     * @param context
     * @return
     */
    private boolean canDownloadState(Context context) {
        try {
            int state = context.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");
            if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
                    || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
                    || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 启用下载组件
     *
     * @param context
     */
    private void enableDowaload(Context context) {
        String packageName = "com.android.providers.downloads";
        Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + packageName));
        context.startActivity(intent);
    }

4、下载完成监听

(1)定义下载完成监听接口

/**
     * 下载完成监听
     */
    public interface OnDownloadCompleted {
        public void onDownloadCompleted(long completeDownloadId);
    }

(2)继承BroadcastReceiver监听下载完成消息

OnDownloadCompleted onDownloadCompleted;
/**
 * 下载完成监听
 */
class DownloadCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);//获取下载完成任务的id
        if (onDownloadCompleted != null) {
            onDownloadCompleted.onDownloadCompleted(completeDownloadId);//调用下载完成接口方法
        }
        //下载完成后删除id
        for (int i = 0; i < downloadIds.size(); i++) {
            if (completeDownloadId == downloadIds.get(i)) {
                downloadIds.remove(i);
            }
        }
    }
}


(3)在Activity或Service中注册DownloadBroadcast广播和监听接口

DownloadCompleteReceiver downLoadCompleteReceiver;

/**
 * 注册广播并注册监听接口
 *
 * @param onDownloadCompleted
 */
public void registerReceiver(OnDownloadCompleted onDownloadCompleted) {
    context.registerReceiver(downLoadCompleteReceiver,
            new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    this.onDownloadCompleted = onDownloadCompleted;
}

(4)使用结束后记得解除DownloadCompleteReceiver广播的注册

/**
     * 解除注册广播
     */
    public void unregisterReceiver() {
        context.unregisterReceiver(downLoadCompleteReceiver);
    }

5、获取下载完成的apk文件并安装

/**
     * 根据任务id打开安装界面
     *
     * @param downloadApkId
     */
    public void installApk(long downloadApkId) {
        Intent install = new Intent(Intent.ACTION_VIEW);
        Uri downloadFileUri = downloadManager.getUriForDownloadedFile(downloadApkId);//获取下载文件路径
        if (downloadFileUri != null) {
            install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
            install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            try {
                context.startActivity(install);//打开安装界面
            } catch (ActivityNotFoundException ex) {
                ex.printStackTrace();
            }
        }
    }

6、获取所有任务id

/**
     * 获取当前下载的所有任务 id
     *
     * @return
     */
    public List<Long> getDownloadIds() {
        return downloadIds;
    }

8、构造方法

public DownloadManagerUtils(Context context) {
        this.context = context;
        getService();
        downLoadCompleteReceiver = new DownloadCompleteReceiver();
        downloadIds = new ArrayList<Long>();
    }

9、使用

DownloadManagerUtils downloadManagerUtils;
    private void testDownload(){
        downloadManagerUtils  = new DownloadManagerUtils(this);
        long id = downloadManagerUtils.download("http://www.apk3.com/uploads/soft/guiguangbao/txsjgj.apk","测试下载","这是一次测试下载");
        downloadManagerUtils.registerReceiver(new DownloadManagerUtils.OnDownloadCompleted() {//注册广播和下载完成监听
            @Override
            public void onDownloadCompleted(long completeDownloadId) {
                downloadManagerUtils.installApk(completeDownloadId);//调用第5步的方法
            }
        });
    }

 @Override
    protected void onDestroy() {
        downloadManagerUtils.unregisterReceiver();//销毁是解除注册
        super.onDestroy();
    }

10、总结:
本文对于DownloadManager的应用智能使用与app更新下载,当然DownloadManager是可以下载各种文件的,具体请参考文章开始两篇文章。


结尾:本文只是个人观点,文章中如有不妥之处敬请留言指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值