前言
前段时间写了一个篇APP自动更新下载的文章自动更新,一个方法搞定,使用系统的DownloadManager 方法超简洁的实现了apk的下载,不过有好多网友反映有一些机型上面这个方法无法实现下载,经过小编的实验在部分机型上确实会有这个问题,所以其中下载的部分只能通过其它方法搞定了。正好看到网上好多关于使用Retrofit实现下载并且监听进度的文章,并且我一直在看Retrofit的东西但是一直没有机会用到,所以我正好拿这个练练手,最终我使用Retrofit + OkHttp + RxBus + Notification + Service实现了这个自动更新下载apk的功能。Demo已经上传的github了大家可以下载下来自己看看,你不仅可以解决App更新的问题,并且可以通过实践了解到一些比较不错的技术。github地址:https://github.com/shanyao0/DownLoadManager,大家多多star和fork,谢谢。。。
原理
基本原理和使用方法跟自动更新,一个方法搞定一样大家不懂得可以参考这里,同样还是一个方法搞定超级简单,不过只是这次的逼格更高,机型兼容性更好。这次手动实现了下载和系统通知进度功能。
- Retrofit2和okhttp实现了apk的下载
- 自定义类实现Retrofit2的Callback类在里面通过IO流写入文件并且使用RxBus订阅下载进度
- 自定义类实现okhttp3的ResponseBody类并且在里面使用RxBus发布下载进度信息
- 在Service中使用Retrofit在后台下载文件
- 发送Notifaction到通知栏前台界面展示进度情况
所以我希望大家可以跟着我下面的实现步骤一步一步的实现这个功能,这样你不仅可以在你的项目中使用高逼格的技术,还可以对这些技术有一个比较初步的认识。
实现步骤
1. 创建UpdateManger管理类
这个类主要写了两个管理更新和弹框的方法,比较简单,跟自动更新,一个方法搞定的差不多除了下载部分
/**
- 检测软件更新
*/
public void checkUpdate(final boolean isToast) {
/**
* 在这里请求后台接口,获取更新的内容和最新的版本号
*/
// 版本的更新信息
String version_info = "更新内容\n" + " 1. 车位分享异常处理\n" + " 2. 发布车位折扣格式统一\n" + " ";
int mVersion_code = DeviceUtils.getVersionCode(mContext);// 当前的版本号
int nVersion_code = 2;
if (mVersion_code < nVersion_code) {
// 显示提示对话
showNoticeDialog(version_info);
} else {
if (isToast) {
Toast.makeText(mContext, "已经是最新版本", Toast.LENGTH_SHORT).show();
}
}
}
/**
* 显示更新对话框
*
* @param version_info
*/
private void showNoticeDialog(String version_info) {
// 构造对话框
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle("更新提示");
builder.setMessage(version_info);
// 更新
builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
// 启动后台服务下载apk
mContext.startService(new Intent(mContext, DownLoadService.class));
}
});
// 稍后更新
builder.setNegativeButton("以后更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
}
2. 初始化RxBus进行简单封装
RxBus的使用可以参考这里用RxJava实现事件总线
import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;
public class RxBus {
private static volatile RxBus mInstance;
private final Subject<Object, Object> bus;