我们都遇到过这样的情况,当点开某个app时,当软件有更新时,它会弹出一个对话框,提示你是否需要更新,可以选择“更新”或“不更新”;当前软件已经是最高版本时,则不会弹出这样的升级提示。今天就来说说软件升级的具体流程。

流程:

1) 首先来说弹出提示对话框的方式,应该是Dialog,而不能是Toast;toast虽然也有提示的功能,但一方面它不能点击,还有就是它是显示一小段时间后自动消息,所以不适合,但它可以作为升级完成后的提示。

提示有新版本知识点: Dialog

a) 获得当前版本号

PackageManager packageMgr = getPackageManager();
PackageInfo packageInfo = packageMgr.getPackageInfo(getPackageName(), 0);
packageInfo.versionCode //当前版本号

要想实现升级,那肯定需要比较某个参数,通过参数的改变,我们才能进行判断是否需要弹出升级对话框。这边我们就需要解析Json数据,因为一般服务器传过来的数据会是个json数组。该这里我们就选择系统版本号与从服务器获得的版本号进行对比,直接比较两者的关系,如果获得版本号大于系统的版本号,则进行弹窗提示。

再从系统获得新的app的下载地址,以供用户下载最新app进行安装替换。

b) 获得服务端新版本的版本号

检查升级的URL,http://bbs.51cto.com/client.php?do=upgrade

json:{
"version": 8,
"downloadurl":"http://bbs.51cto.com/client.php?do=down",
"newfeature":"1. 新增xx功能; 2. 修复xxbug"
}

2) 用户点击取消升级,对话框自动消失,不做任何操作;用户确认升级,下载 后台下载,通知栏显式进度

自定义通知中进度条的更新

mNotify.contentView.setTextViewText(R.id.textView2, "30");
mNotify.contentView.setProgressBar(R.id.progressBar1, 100, 30, false);
mNotifyMgr.notify(123, mNotify );

3) 下载完成,Toast提示下载完成,通知栏中有显示,可以点击选择安装,也可以取消不安装,或是下次再进行安装。用户点击通知执行更新安装,则会启动安装界面。启动安装界面其实也是由当前页面跳转到安装页面,而安装页面是由系统提供,所以通过隐式意图来进行启动跳转、安装。

启动apk安装界面

隐式意图

action:Intent.ACTION_VIEW
Flag: Intent.FLAG_ACTIVITY_NEW_TASK
data: Uri.fromFile(apkfile)
type: "application/vnd.android.package-archive"
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
File newApkFile = new File(apkFilePath);
intent.setDataAndType(Uri.fromFile(newApkFile),
"application/vnd.android.package-archive");

对于android中实现软件更新及安装中代码的实现步骤,在app的更新安装中也经常使用到,所以我们可以将这个项目封装成一个lib(库),方便以后的调用。后面别人实现下载时,可能就只需要几个添加几个参数就能实现更新,而不需要接触到底层代码,也将大大提高开发效率。