对于一个APP来说功能的不断更新和BUG的改进是必须的过程,我们会将改进的地方实现在一个新的APP中,用户通过下载新的版本来代替旧的版本,对于一个程序来说就要编写监听版本更新的代码,下面就来写写如何实现监听版本更新,如何下载新的版本并替代旧的版本 我总结了下面的几个小步骤: - 判断当前版本 - 下载新的版本 - 将旧版本删除 - 安装 在这里我写了一个版本更新的类VersonTools将更新版本的方法写到了里面
判断当前手机上的版本 并与服务器中的版本进行比较 1.获取服务器最新的版本
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 boolean onCache(List<ConfigInfo> result) { return false; } @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); if (versonNow.equals(verson)) { Toast.makeText(context, "当前版本号:" + versonNow, Toast.LENGTH_LONG).show(); } else { //版本号不匹配出现更新版本提示 showDialog(context,versonNow); } } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); }3.将两个值进行比较
String verson = getVersonName(context); if (versonNow.equals(verson)) { Toast.makeText(context, "当前版本号:" + versonNow, Toast.LENGTH_LONG).show(); } else { //版本号不匹配出现更新版本提示 showDialog(context,versonNow); }这样我们整体思路就写完了,下面就是具体步骤,如果版本不匹配怎么样下载新的版本,怎样安装,全部在showDialog(context,versonNow)这个方法里面,点击确定删除旧版本安装新版本,取消则返回界面
//显示提醒对话框 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); } }; }首先要先将旧版本删除(下面详解)其次实例化下载的类对它设置进行下载最后需要一个广播监听下载的进度,下载完在保存安装
在这里还存在着一个文件的工具类(自己写的),里面有判断文件是否存在和删除文件的方法,具体实现方法如下
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最新版本 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); } }这样版本更新就算是完成了,最后在用户打开APP的时候调用这个类中的方法就可以检查版本更新了
VersonTools v = new VersonTools(); v.checkerson(this);新闻热点
疑难解答