在项目中做版本更新,流程如下:
1. 检查版本
2. 显示版本提示
3. 下载apk
4. 安装
于是我将相关代码进行重构,定义版本更新的骨架而将一些方法延迟到子类。
public abstract class CheckVersion {
public static final String APK_FILE_PATH = ""; //apk保存路径
private Activity mActivity;
public CheckVersion(Activity activity) {
this.mActivity = activity;
}
/**
* 检查版本
*/
public final void checkVersion() {
if (isUpdate()) {
if (forceUpdate()) {//如果强制更新直接下载
downloadApk();
return;
}
//显示更新提示
showUpdateDialog(mActivity, new VersionDialogCallBack() {
@Override
public void onCancel() {
cancelUpdate();
}
@Override
public void onSubmit() {
downloadApk();
}
});
}
}
//是否强制更新,当版本不稳定设置为true
protected boolean forceUpdate() {
return false;
}
//是否更新
protected abstract boolean isUpdate();
//显示更新对话框
protected abstract void showUpdateDialog(Activity context, VersionDialogCallBack callBack);
//下载apk
protected abstract void downloadApk();
//取消更新
protected void cancelUpdate() {
T.ToastShort("您稍后可以在设置界面进行手动更新");
}
//安装apk
protected void installApk(File apk) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(apk), "application/vnd.android.package-archive");
mActivity.getApplicationContext().startActivity(intent);
}
//对话框回调
public interface VersionDialogCallBack {
//关闭
void onCancel();
//更新
void onSubmit();
}
}
实现类(项目保密,提供测试)
public class TestChekVersion extends CheckVersion {
public TestChekVersion(Activity activity) {
super(activity);
}
@Override
protected boolean isUpdate() {
//请求数据,比较服务器版本号与当前版本
return true;
}
@Override
protected void showUpdateDialog(Activity context, final VersionDialogCallBack callBack) {
new AlertDialog.Builder(context)
.setTitle("版本更新提示")
.setMessage("1.优化主页布局\n2.修改BUG,添加友好提示")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
callBack.onCancel();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
callBack.onSubmit();
}
})
.create()
.show();
}
@Override
protected void downloadApk() {
//根据apk网络地址进行下载并保存到APK_FILE_PATH路径下,下载完成调用installApk安装。
String apkUrl = "xxxxxxx.apk";//获取方式 1.在检查更新isUpdate获取 2.在此方法获取
L.d("下载地址" + apkUrl);
}
}
代码调用
new TestChekVersion(this).checkVersion(); //this为MainActivity