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 {@Overridepublic void onReceive(Context context, Intent intent) {long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);//获取下载完成任务的idif (onDownloadCompleted != null) {onDownloadCompleted.onDownloadCompleted(completeDownloadId);//调用下载完成接口方法}//下载完成后删除idfor (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() {//注册广播和下载完成监听@Overridepublic void onDownloadCompleted(long completeDownloadId) {downloadManagerUtils.installApk(completeDownloadId);//调用第5步的方法}});}@Overrideprotected void onDestroy() {downloadManagerUtils.unregisterReceiver();//销毁是解除注册super.onDestroy();}
10、总结:
本文对于DownloadManager的应用智能使用与app更新下载,当然DownloadManager是可以下载各种文件的,具体请参考文章开始两篇文章。
结尾:本文只是个人观点,文章中如有不妥之处敬请留言指教。
Android APP更新下载工具类——简单封装DownloadManager相关推荐
- Redis存储缓存工具类简单封装
一.公共实体类 (1)User.java package cn.xiyou.entity;import java.io.Serializable;/*** User实体* * @author XIOA ...
- springboot上传下载文件(4)--上传下载工具类(已封装)
因为在做毕设,发现之前的搭建ftp文件服务器,通过ftp协议无法操作虚拟机临时文件,又因为ftp文件服务器搭建的比较麻烦:而 hadoop的HDFS虽然可以实现,但我这里用不到那么复杂的:所以我封装了 ...
- Fresco图片加载框架的介绍,相关开源库以及工具类的封装
Fresco图片加载框架的介绍,相关开源库以及工具类的封装 本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 简介 Fresco 是Facebook开源的安卓上的 ...
- android 字体像素转换工具类_android px,dp,sp大小转换工具
package com.voole.playerlib.util; import android.content.Context; /** * Android大小单位转换工具类 * * float s ...
- C# 网络爬虫+HtmlAgilityPack+Xpath+爬虫工具类的封装的使用
目录 1 工具准备 2 思路准备 3 附加知识准备--XPath 简述 看看例子 用XPath来寻找标签 获取所有同名的标签 获取指定标签 一个实例 最后的补充 4 代码实现 5 爬虫工具类的封装 6 ...
- JWT|概述|JWT结构|JWT在java中的使用|JWT工具类的封装|JWT在springboot中的使用|JWT与拦截器的配合
JWT ! 前记: 官网:https://jwt.io/ jwt有人说是用计算力换空间(相对于session) 小程序后台要求全部用springboot实现..登录状态的管理:本来想用自己随便生成UU ...
- javascript 总结(常用工具类的封装)(转)
转载地址:http://dzblog.cn/article/5a6f48afad4db304be1e7a5f javascript 总结(常用工具类的封装) JavaScript 1. type 类型 ...
- javascript 总结(常用工具类的封装,转)
javascript 总结(常用工具类的封装) 前言 因为工作中经常用到这些方法,所有便把这些方法进行了总结. JavaScript 1. type 类型判断 isString (o) { //是否字 ...
- 华为云OBS文件上传下载工具类
Java-华为云OBS文件上传下载工具类 文章目录 Java-华为云OBS文件上传下载工具类 1.华为云obs文件上传下载 2.文件流转MultipartFile 3.File转换为Multipart ...
最新文章
- java时间转换为字符串格式错误_字符串转换为日期时间格式及其错误处理(转)
- Android开发之fragment之replace用法
- lambda表达式优化反射_反射选择器表达式
- Earth’s best1段有机南瓜泥
- H5实现多图片预览上传,可点击可拖拽控件介绍
- JS、Java、C 依然强势,Go、Kotlin、Python 成为潜力股,2020 开发者生态系统报告揭晓!...
- 运输层--TCP协议(2)
- android 模拟器 安装教程,电脑用安卓模拟器详细安装教程
- 各种手机处理器排行榜_手机处理器CPU性能排名
- WBS-Work Breakdown Structure工作分解结构
- word2vec使用说明
- matlab 弗洛伊德算法,手写matlab的弗洛伊德算法的函数(注释很详细)
- 软件工程研究生在读一年总结
- android 充电电压过压保护值修改
- 《手机与数字娱乐产品可用性的分析》
- 小额贷款的趣店赴美上市 到底值不值100亿美元?
- Bootstrap -Card卡片
- python:批量修改文件的访问时间、修改时间、改变时间!
- 构建Java体系之感悟系列(一)
- struct ethtool_ops详解