关于androidAPK版本升级,其实是很多APK必须的,现在就分享一下我对于APK更新原理的理解和代码实现。
apk更新原理
首先需要明白两点:
1:服务器需要提供URL1(服务器存储的apk版本信息)
2:服务器需要提供URL2(下载新版本apk文件)
下面开始说一下APK升级原理:
1:我们需要先通过URL1从服务器拉取服务器存储的apk版本信息;
2:然后我们在获取本地版本号;比较两者版本号,如果两个版本号相等,那就是无需更新;反之前者版本号 大于本地版本号,需要更新;
3:此时应该弹出一个Dialog,提示用户是否需要更新;
4:如果用户选择升级,此时应该在弹出一个Dialog用于显示下载进度,同时也就应该开启一个线程(路径:URL2)用于下载新版本apk文件,下载过程中更新显示进度Dialog;
5:下载完成之后,安装apk。
至此apk更新原理大致就完了。
注意点:
试想一下如果有的用户下载完新版本apk文件之后,不安装。那么每一次在进入app时,都得重新下载apk文件,为了防止这种恶意操作,因此,在下载新版本apk的时候,先将本地存储的apk文件版本号与本应用版本号做对比,如果大于,就无需下载了,直接进行安装即可;反之,我们删除本地apk文件,从服务器重新下载apk文件
附上原理图:
PS:字写得不好,将就着看吧,这不是重点。。。
apk更新代码实现
1:关于从服务器拉去版本信息,这一步略过(平时的网络访问获取数据,这个没啥好写的)
2:获取应用版本号
/**
* 获取本地版本号
* @return
*/
private int getVersionCode(){
PackageManager packageManager = context.getPackageManager();
int versionCode = 0;
try {
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionCode = packageInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return versionCode;
}
3:关于下载新版本apk文件,略过(同上)
4:安装新版本apk;
/**
* 安装apk
*/
private void installApk(){
//新下载apk文件存储地址
File apkFile = new File(Environment.getExternalStorageDirectory() + "/cache/app/apkDownLoad.apk");
if(! apkFile.exists()){
Toast.makeText(context, "安装包不存在", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + apkFile.toString()), "application/vnd.android.package-archive");
context.startActivity(intent);
}
PS:源码中没有实现用户恶意操作的防护(上文中的注意点)