您的位置:首页 > 移动开发

Android App的版本升級(迭代/更新)

2017-02-16 16:09 218 查看
为了修复bug和拓展功能,app是需要不断升级和维护的。推荐一个我写的app更新库——VersionUpdater,该库将版本升级的通用代码封装起来,并将其和版本更新时的UI提示剥离开来,使用者只需处理自己的UI提示即可。

郭大侠粉丝之众,令在下敬仰。其中不乏学生党。因此,先做些知识铺垫:
①先说说VersionCode和VersionName //内部版本号,用户不可见,用于应用市场、android系统及自身程序内部,是整型值(便于不同版本间比较)
versionCode 2
//外部版本标识,仅用于展示给用户看,让用户对版本有个感性的认知,是字符串值
versionName "1.0.1"每次发布新版本,都要提升下VersionCode的值,VersionName也要做出相应修改。
曾经,我的几个同事争论VersionName应该是两位(1.0)还是三位的(1.0.0),其实这个没有硬性规定,位数多的话,对于更新频繁和维护周期长的应用,不至于短时间内版本号就升到很高。例如QQ手机版的版本号就是四位的。所以版本名称位数,视项目的需要灵活而定。
②服务器通常会提供一个上传平台,供我们上传新版apk的版本信息及apk文件



③app运行时,通过后端人员提供的接口获取最新的版本信息后与本地比较,若高于本地版本,则表示需要升级,下载最新apk文件到本地。app会自动发起检测,也会提供用户手动检测的功能。
获取最新版本信息的接口返回的json信息大致是这样的:
...
{
"VersionCode": 2,
"VersionName": "1.0.1",
"VersionInfo": "①蓝牙打印优化
"DownLoadUrl": "http://xxxxxxxx/AppFolders/20180203/PPGSender_v1.0.1.apk",
"ForceUpdate": 0
}
...其中包含了版本号、版本名称、更新信息、是否强制更新、最新apk文件的下载地址。出于职业操守,公司域名用xxxxxxx代替。
获取本地版本号, public static int localVersionCode(Context context) {
int versionCode = 1;

try {
versionCode = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}

return versionCode;
}也可以简单地使用BuildConfig.VERSION_CODE,Gradle会在自动生成地BuildConfig类里生成版本号、版本名称、包名、构建类型等信息。
④下载apk,建议使用DownloadManager。
它是google提供的,专门用于后台长时间下载文件的类,属于系统级服务。你不必编写复杂的下载代码,也不必做其他特殊处理,比如,如果我们自己实现下载apk,为了避免下载线程被杀死(因为下载apk相对而言是“漫长的”),需开启Service来执行下载线程。一言而蔽之,你通过其他方式实现下载apk的所有功能,DownloadManager都可以高效、便利地提供,此外,其另有独到之处,比如,可随时查询下载的状态、进度,当网络断开或设备重启导致下载暂停时,待网络恢复或设备开机时自动恢复。 //获取DownloadManager对象
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
//构造apk下载地址的Uri对象
Uri apkUri = Uri.parse("http://xxxxxxxx/AppFolders/20180203/PPGSender_v1.0.1.apk");
//创建一个下载任务
DownloadManager.Request request = new DownloadManager.Request(apkUri)
//设置文件的保存位置
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "PPGSender_v1.0.1.apk")
//下载时,状态栏会出现一个通知条,设置其展示模式
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
//设置通知条的标题
.setTitle("配送员");
//将下载任务加入执行队列,返回唯一id,标识该任务,用于之后进行查询操作等
final long downloadId = downloadManager.enqueue(request);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息