一个App在版本更新的时候需要做些什么
我总结了下面的几个小步骤:
- 判断当前手机版本和服务器中的版本
- 下载新的版本
- 将旧版本删除
- 安装
在这里我写了一个版本更新的类VersonTools将更新版本的方法写到了里面
判断当前版本
判断当前手机上的版本 并与服务器中的版本进行比较
1.获取服务器最新的版本
这是用的xUtils获取的网络数据,只显示成功回调的那个方法~
public void checkerson(final Context context) {
RequestParams requestParams = new RequestParams(Const.SERVLET_GET_CONFIG);
x.http().get(requestParams, new Callback.CacheCallback<List<ConfigInfo>>() {
@Override
public void onSuccess(List<ConfigInfo> result) {
//得到返回的数据,里面有服务器版本号信息
for (ConfigInfo a : result) {
Log.e("TAG", a.toString());
}
String versonNow = result.get(0).getLoadurl_android();
//得到当前手机版本
String verson = getVersonName(context);
//比较(versonNow :服务器版本,verson手机当前版本)
if (versonNow.equals(verson)) {
Toast.makeText(context, "当前版本号:" + versonNow, Toast.LENGTH_LONG).show();
} else {
//版本号不匹配出现更新版本提示
showDialog(context,versonNow);
}
}
});
}
3.得到手机版本号的方法 (和上面略有出入)
private String getVersion(){
String version=null;
//查看当前版本
try {
//可以得到清单文件的所有信息
PackageManager packageManager=getActivity().getPackageManager();
String packageName=getActivity().getPackageName();
PackageInfo packageInfo= packageManager.getPackageInfo(packageName,0);
//得到版本信息
version= packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return version;
}
版本判断完了,下面就是下载安装最新版本删除旧版本了
//显示提醒对话框
private void showDialog(final Context context,final String downurl) {
final AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("系统提示").setMessage("您的系统需要更新").setPositiveButton("更新", new DialogInterface.OnClickListener() {
//确定更新后的操作
@Override
public void onClick(DialogInterface dialog, int which) {
//确定更新下载最新版本
new UpgradeProgram().downloadApk(downurl,context);
dialog.dismiss();
}
//取消更新的操作
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
下载新的版本
从上面可以看到UpgradeProgram().downloadApk(downurl,context)这个方法 将服务器的网址和当前环境传入
public void downloadApk(String url, Context context) {
//删除历史的APK(后面提到)
deleteApk();
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(url);
DownloadManager.Request down = new DownloadManager.Request(uri);
//设置允许使用的网络类型,这里是WIFI和移动网络都可以
down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
//不显示下载界面
down.setVisibleInDownloadsUi(false);
down.setTitle(Const.APK_NAME + "升级中");
//设置下载后的存放位置(前面是路径后面是保存的apk的名称)
down.setDestinationInExternalPublicDir(Const.IMAGE_TEMP_FILE_PATH, Const.APK_NAME);
//将下载请求保存到队列
final long request =manager.enqueue(down);
//将下载完的id保存起来,广播监听到下载完毕的时候取出来
SharedPreferencesUtils shared =new SharedPreferencesUtils();
shared.putLong(context,Const.SHARD_PREFERENCES_DOWN_QUEUE,request);
//设置广播监听下载完成
final IntentFilter filter=new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
receiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
long reference=intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,-1);
if(reference==request){
//下载完成自动安装app
installApk(context);
}
context.registerReceiver(receiver,filter);
}
};
}
首先要先将旧版本删除(下面详解)其次实例化下载的类对它设置进行下载最后需要一个广播监听下载的进度,下载完在保存安装
删除旧的版本
private void deleteApk() {
FileUtils fileUtils = new FileUtils();//判断文件是否存在的类
String filePath = SDCardUtils.getSDCardPath() + Const.IMAGE_TEMP_FILE_PATH + Const.APK_NAME;//得到文件存档的路径
if (fileUtils.isExist(filePath)) {
fileUtils.delete(filePath);
}
}
在这里还存在着一个文件的工具类(自己写的),里面有判断文件是否存在和删除文件的方法,具体实现方法如下
public boolean isExist(String filePathName) {
File file = new File(filePathName);
return (!file.isDirectory() && file.exists());
}
public boolean delete(String filePathName) {
if(isNullString(filePathName)) return false;
File file = new File(filePathName);
if (file.isFile() && file.exists()) {
return file.delete();
}
return false;
}
这样文件就可以被很简单的删除了
将APP安装在手机上
下载了新软件,删除了旧的软件下面就是将软件安装在手机上了
//安装APP最新版本
private void installApk(Context context) {
//文件保存地址
String saveFile = SDCardUtils.getSDCardPath() + Const.IMAGE_TEMP_FILE_PATH + "/" + Const.APK_NAME;
File apkfile = new File(saveFile);
if (!apkfile.exists()) {
return;
}
Intent i = new Intent(Intent.ACTION_VIEW);//显示用户数据的方法
//打开某个文件
i.setDataAndType(Uri.parse("file//" + apkfile.toString()), "application/vnd.android.package-archive");//文件URI,文件类型
context.startActivity(i);
if (receiver != null) {//将监听下载的广播取消注册
context.unregisterReceiver(receiver);
}
}
判断版本是否需要更新
如果更新下载新版本
删除旧版本
安装新版本