序:
app项目上线后需要持续发版迭代,通过版本控制自动升级(或者说当app启动时,自动检测有最新版本,自动安装升级)就显得尤为重要,那么接下来设计具体如何落地。
总体思路就是当app启动时,去调用后端一个查询最新版本号的接口,与app的当前版本号比较,如果接口里发布了大于当前版本号的app就提示用户升级,用户点击升级后,自动下载安装。
一、数据库设计:
我这里使用的mysql5.7,表结构设计如下:
sql
CREATE TABLE `app_sersion` (
`app_version_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`app_version` varchar(255) DEFAULT NULL COMMENT 'app版本号',
`app_download_url` varchar(255) DEFAULT NULL COMMENT 'app下载地址',
PRIMARY KEY (`app_version_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='app版本管理';
二、java后端接口设计:

写一个app_sersion表的增删改查,代码这里不贴出来了,连同安卓端代码和sql统一打包到以下链接,有需要的朋友可以下载。
代码下载地址:
https://download.csdn.net/download/gaowenhui2008/92856583
三、安卓端(Kotlin实现)设计:

MyLoginActivity.kt
onCreate方法中调用update_soft()方法
Kotlin
public fun update_soft() {
val manager = UpdateManager(this)
manager.checkUpdate();
}
Kotlin
/**
* 检测软件更新
*
* @throws IOException
* @throws NotFoundException
*/
@Throws(Resources.NotFoundException::class, IOException::class)
fun checkUpdate() {
Thread(object : Runnable {
override fun run() {
// TODO Auto-generated method stub
try {
if (isUpdate) {
// 显示提示对话框
Looper.prepare()
showNoticeDialog()
Looper.loop()
// Log.d("消息", "有新版本")
} else {
// Toast.makeText(mContext, R.string.soft_update_no,
// Toast.LENGTH_LONG).show();
// Log.d("消息", "已是最新版本");
}
} catch (e: Resources.NotFoundException) {
// TODO Auto-generated catch block
// Toast.makeText(UpdateManager.this, "QQ空间", 2).show();
e.printStackTrace()
} catch (e: IOException) {
// TODO Auto-generated catch block
e.printStackTrace()
}
}
}).start()
}
Kotlin
/**
* 显示软件更新对话框
*/
private fun showNoticeDialog() {
// 构造对话框
val builder: AlertDialog.Builder = Builder(mContext)
builder.setTitle(R.string.soft_update_title)
builder.setMessage(R.string.soft_update_info)
builder.setCancelable(false)
// 更新
builder.setPositiveButton(
R.string.soft_update_updatebtn,
object : DialogInterface.OnClickListener {
public override fun onClick(dialog: DialogInterface?, which: Int) {
//dialog.dismiss();
// 显示下载对话框
showDownloadDialog()
}
})
// 稍后更新
builder.setNegativeButton(
R.string.soft_update_later,
object : DialogInterface.OnClickListener {
public override fun onClick(dialog: DialogInterface, which: Int) {
dialog.dismiss()
}
})
val noticeDialog: Dialog = builder.create()
noticeDialog.show()
}
Kotlin
/**
* 显示软件下载对话框
*/
private fun showDownloadDialog() {
// 构造软件下载对话框
val builder: AlertDialog.Builder = Builder(mContext)
builder.setTitle(R.string.soft_updating)
// 给下载对话框增加进度条
val inflater = LayoutInflater.from(mContext)
val v: View = inflater.inflate(R.layout.layout_softupdate_progress, null)
mProgress = v.findViewById<View?>(R.id.update_progress) as ProgressBar
builder.setView(v)
// 取消更新
builder.setNegativeButton(
R.string.soft_update_cancel,
object : DialogInterface.OnClickListener {
public override fun onClick(dialog: DialogInterface, which: Int) {
dialog.dismiss()
// 设置取消状态
cancelUpdate = true
}
})
mDownloadDialog = builder.create()
mDownloadDialog!!.show()
// 现在文件
downloadApk()
}
四、最终效果:
