序app项目上线后需要持续发版迭代通过版本控制自动升级或者说当app启动时自动检测有最新版本自动安装升级就显得尤为重要那么接下来设计具体如何落地可以加我底部wx交流gaowh1112。总体思路就是当app启动时去调用后端一个查询最新版本号的接口与app的当前版本号比较如果接口里发布了大于当前版本号的app就提示用户升级用户点击升级后自动下载安装。一、数据库设计我这里使用的mysql5.7表结构设计如下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 ) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8 ROW_FORMATDYNAMIC COMMENTapp版本管理;二、java后端接口设计写一个app_sersion表的增删改查代码这里不贴出来了连同安卓端代码和sql统一打包到以下链接有需要的朋友可以下载。下载链接https://download.csdn.net/download/gaowenhui2008/92862702三、安卓端Kotlin实现设计MyLoginActivity.ktonCreate方法中调用update_soft()方法public fun update_soft() { val manager UpdateManager(this) manager.checkUpdate(); }/** * 检测软件更新 * * 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() }/** * 显示软件更新对话框 */ 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() }/** * 显示软件下载对话框 */ 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.findViewByIdView?(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() }四、最终效果