一、应用场景及介绍
不多讲,APP更新几乎每个APP都会用到。
更新APP的选择:
一、根据自己APP使用的网格框架,自己写一套下载的逻辑,移植兼容性不强。
二、用系统的下载器(DownloadManager),移植没兼容性问题。
二、更新的展示方式
APP内UI直接展示。
退到后台,通知栏更新。
三、更新内容分析
APK下载的URL,APK的版本号。
本地存储路径,APK本地存储名称等。
下载进度的回调,用于内部UI更新。
四、创建更新内容实体类
/**
* 更新apk的Bean
*/
public class AppUpdateBean implements Serializable {
// 更新APK的URL
private String apkUrl;
// 后台最新的版本号
private int versionCode;
// ==============附加信息可以不填写==============
// apk文件名称(本地的名称)
private String apkName;
public AppUpdateBean(String apkUrl, String apkName, int versionCode) {
this.apkUrl = apkUrl;
this.apkName = apkName;
this.versionCode = versionCode;
}
public String getApkUrl() {
return apkUrl;
}
public int getVersionCode() {
return versionCode;
}
public String getApkName() {
return apkName;
}
}
五、定义下载进度回调监听接口
/**
* 更新APK的监听
*/
public abstract class OnUpdateListener implements Serializable {
/**
* 下载失败
*/
public abstract void onFailed(String msg);
/**
* 下载成功
*/
public abstract void onSucceed(File apkFile);
/**
* 下载进度
* @param total 总APK大小
* @param current 当前进度
* @param progress 进度百分比
*/
public abstract void onProgress(int total, int current, float progress);
}
六、更新步骤分析
请求后台获取更新APK的内容。
判断后台APK的版本和当前使用APK的版本号,根据版本号情况进行更新。
下载前,判断本地有没有下载好,下载好根据版本号情况直接安装或者重装下载。
七、使用DownloadManager下载器进行下载更新
/**
* 下载更新APP的工具类
*/
public class DownloadUtils {
private static final String CONFIG = "APK_UPDATE";
private static final String DOWNLOADED = "DOWNLOADED";
// 默认APK本地名称
public static final String DEF_APK_NAME = "update.apk";
private final SharedPreferences mPreferences;
// 下载器
private DownloadManager downloadManager;
private Context mContext;
// 下载的ID
private long downloadId = -1;
// 下载要用到的类
private AppUpdateBean mUpdateBean;
private OnUpdateListener mOnUpdateListener;
private static Handler mHandler = new Handler(Looper.getMainLooper());
public DownloadUtils(Context context, AppUpdateBean updateBean) {
if (mContext == null) {
new RuntimeException("context is null");
}
this.mContext = context.getApplicationContext();
this.mUpdateBean = updateBean;
mPreferences = mContext.getSharedPreferences(CONFIG, Context.MODE_PRIVATE);
}
/**
* 注意:要自己添加内存卡读取权限
* 下载apk主要方法
*/
public void downloadAPK() {
// 1. 非空校验
if (mContext == null || mUpdateBean == null) {
return;
}
// 2. URL校验
String url = mUpdateBean.getApkUrl();
if (Te