版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010872619/article/details/78549236
最近公司需求需要把公司所有app更新,整合成一个模块,做一个统一的更新界面。先说一下具体实现思路,更新分为普通更新和强制更新,应用首次进入时获取app最新信息,保存对应信息,如果版本大于当前版本,弹出更新提示dialog,如果用户点击更新,或者暂不更新,都保存此时的时间。下次进入app时,先检测上次检测的是否为强制更新,如果是则获取app信息,否则根据现在时间减去之前存的时间点,算出时间差,如果6小时内则不进行请求app信息(根据自己业务需求)。用户点击更新,则启动下载,如果因网络原因下载暂停,下次更新会从上次下载的地方继续下载。
以下贴出核心使用说明代码,给大家支出一个方向。如需源码:[源码下载](http://download.csdn.net/download/u010872619/10121077)
/**
* 检查更新,进入app调用UpdateCenter.getInstance(this).updateApk();
*/
public void updateApk() {
if (CommonUtils.isNetworkConnected(mActivity)) {
isUpdate();
} else {
Log.e(TAG, "updateApkCall: ---网络异常");
}
}
/**
* 用户主动检查更新,调用UpdateCenter.getInstance(this).detectApk();
*/
public void detectApk() {
loadApkInfo("isdetect");
}
/**
* 判断是否需要更新
*/
private void isUpdate() {
long time = System.currentTimeMillis() - mUpdateSPUtils.getLong(Constant.UPGRADE_TIME_KEY, 0);
Log.e(TAG, "---System.currentTimeMillis():" + System.currentTimeMillis()
+ " 更新时间:" + mUpdateSPUtils.getLong(Constant.UPGRADE_TIME_KEY, 0) + " time:" + time);
//上次检查过存的是否强制更新状态
boolean isForce = mUpdateSPUtils.getBoolean(Constant.UPGRADE_ISFORCE_KEY, false);
//如果上次检测是强制更新而没有更新继续检测,否则6小时内不再检测
if (isForce) {
Log.e(TAG, "isUpdate: ---强制更新");
loadApkInfo(null);
} else {
if (time > minUpdateTime) {
loadApkInfo(null);
} else {
Log.e(TAG, "isUpdate: ---小于6小时,忽略更新");
}
}
}
/**
* 开启线程,获取最新apk信息
*
* @param isdetect 是否主动检查更新(任意字符串)
*/
private void loadApkInfo(String isdetect) {
Log.e(TAG, "loadApkInfo: ---开始获取最新apk信息");
AsyncTask.Status status = null;
if (mAsyncTask != null) {
status = mAsyncTask.getStatus();
if (AsyncTask.Status.FINISHED == status) {
mAsyncTask = null;
}
}
if (mAsyncTask == null) {
initThread();
}
if (status != AsyncTask.Status.RUNNING) {
mAsyncTask.execute(getUploadUlr(), isdetect);
}
}
/**
* 初始化更新异步任务,获取最新apk信息,然后解析
*/
private void initThread() {
mAsyncTask = new AsyncTask<String, Void, ApkInfo>() {
private boolean isdetect = false;
@Override
protected ApkInfo doInBackground(String... params) {
String urlString = params[0];
isdetect = params[1] == null ? false : true;
if (TextUtils.isEmpty(urlString)) {
return null;
}
ApkInfo apkInfo = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream inputStream = null;
byte[] result = null;
URL url = null;
HttpURLConnection connection = null;
try {
url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5 * 1000);
connection.setReadTimeout(5 * 1000);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
inputStream = connection.getInputStream();
byte[] buff = new byte[2014];
int length = 0;
while ((length = inputStream.read(buff)) != -1) {
baos.write(buff, 0, length);
baos.flush();
}
result = baos.toByteArray();
Log.e(TAG, "initThread---json:" + new String(result));
JSONObject json = new JSONObject(new String(result));
int rus = json.isNull("rt") ? -1 : json.getInt("rt");
if (rus == 1) {
apkInfo = new ApkInfo();
apkInfo.setIcon(json.isNull(Constant.UPGRADE_ICON_KEY) ? "" : json.getString(Constant.UPGRADE_ICON_KEY));
apkInfo.setIsforce(json.isNull(Constant.UPGRADE_ISFORCE_KEY) ? false : json.getBoolean(Constant.UPGRADE_ISFORCE_KEY));
apkInfo.setDescription(json.isNull(Constant.UPGRADE_DESCRIPTION_KEY) ? "" : json.getString(Constant.UPGRADE_DESCRIPTION_KEY));
apkInfo.setName(json.isNull(Constant.UPGRADE_NAME_KEY) ? null : json.getString(Constant.UPGRADE_NAME_KEY));
apkInfo.setMd5(json.isNull(Constant.UPGRADE_MD5_KEY) ? null : json.getString(Constant.UPGRADE_MD5_KEY));
apkInfo.setPath(json.isNull(Constant.UPGRADE_PATH_KEY) ? null : json.getString(Constant.UPGRADE_PATH_KEY));
apkInfo.setRt(json.isNull(Constant.UPGRADE_RT_KEY) ? -1 : json.getInt(Constant.UPGRADE_RT_KEY));
apkInfo.setVersion(json.isNull(Constant.UPGRADE_VERSION_KEY) ? null : json.getString(Constant.UPGRADE_VERSION_KEY));
apkInfo.setVcode(json.isNull(Constant.UPGRADE_VCODE_KEY) ? -1 : json.getInt(Constant.UPGRADE_VCODE_KEY));
mUpdateSPUtils.put(apkInfo);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
//Log.e(TAG, "urlString---:" + urlString);
return apkInfo;
}
/** doInBackground 之后 */
@Override
protected void onPostExecute(ApkInfo apkInfo) {
if (apkInfo != null) {
Log.e(TAG, "onPostExecute 服务器获取到的versionCode:" + apkInfo.getVcode() + " 当前软件 versionCode:" + ApkInfoUtil.getAppVersionCode(mActivity, null));
if (apkInfo.getVcode() > ApkInfoUtil.getAppVersionCode(mActivity, null)) {
showUpdateDialog(apkInfo);
} else {
if (isdetect) {
Toast.makeText(mActivity, CommonUtils.plusString(mActivity.getString(R.string.has_new_version_apk),
apkInfo.getName(), "!"), Toast.LENGTH_LONG).show();
}
}
}
}
/** doInBackground 之前 */
@Override
protected void onPreExecute() {
}
};
}
/**
* 显示更新dialog,这里自定义的一个dialog,根据自己公司业务定制
*
* @param apkInfo
*/
private void showUpdateDialog(ApkInfo apkInfo) {
UpdateDialog dialog = new UpdateDialog(mActivity, apkInfo, this);
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
/**
* dialog 点击立即更新按钮回调:使用FileDownloader下载app
*/
@Override
public void updateListener(ApkInfo apkInfo) {
DownloadAppUtils.download(mActivity, apkInfo);
}
/**
* dialog 点击x按钮回调
*/
@Override
public void closeListener(ApkInfo apkInfo) {
if (apkInfo.isforce()) {
exit();//退出应用
}
}
/**
* dialog 点击暂不更新按钮回调
*/
@Override
public void notUpdateListener(ApkInfo apkInfo) {
if (apkInfo.isforce()) {
exit();//退出应用
} else {
mUpdateSPUtils.putLong(Constant.UPGRADE_TIME_KEY, System.currentTimeMillis());
}
}