如何自动更新版本

原创 2016年05月31日 15:18:38
第一步 服务器端:服务端提供一个借口,或者网址,我这里就用的服务器是tomcat,这里提供一个网址如下://也就是一个json数据接口 public static final String UPDATE_URL = "http://192.168.1.103:8080/update.json";我们来看下json数据参数:{//app名字appname: "爱新闻1.1",//服务器版本号serverVersion: "2",//服务器标志serverFlag: "1",//是否强制更新lastForce: "1",//apk下载地址,这里我已经下载了官方的apk,放到了服务器里面updateurl: "http://192.168.1.103:8080/36Kr.apk",//版本的更新的描述upgradeinfo: "V1.1版本更新,你想不想要试一下哈!!!"}第二步 客户端需要实现:首先我们要去解析服务端给的json,那么我们就要来创建一个model类了(代码过多,这里只有字段,getter和setter方法自己创建)://app名字 private String appname; //服务器版本 private String serverVersion; //服务器标志 private String serverFlag; //强制升级 private String lastForce; //app最新版本地址 private String updateurl; //升级信息 private String upgradeinfo;在这里使用了一个辅助类,基本和model字段差不多:public class UpdateInformation { public static String appname = MyApplication.getInstance() .getResources().getString(R.string.app_name); public static int localVersion = 1;// 本地版本 public static String versionName = ""; // 本地版本名 public static int serverVersion = 1;// 服务器版本 public static int serverFlag = 0;// 服务器标志 public static int lastForce = 0;// 之前强制升级版本 public static String updateurl = "";// 升级包获取地址 public static String upgradeinfo = "";// 升级信息 public static String downloadDir = "wuyinlei";// 下载目录}在进入app的时候,这个时候如果检测到服务器端有了新的版本,就回弹出提示框,提示我们更新。这个我们在MainActivity里面处理逻辑(onCreate()方法里面): OkhttpManager.getAsync(Config.UPDATE_URL, new OkhttpManager.DataCallBack() { @Override public void requestFailure(Request request, Exception e) { } @Override public void requestSuccess(String result) { try { Log.d("wuyiunlei",result); JSONObject object = new JSONObject(result); UpdateInfoModel model = new UpdateInfoModel(); model.setAppname(object.getString("appname")); model.setLastForce(object.getString("lastForce")); model.setServerFlag(object.getString("serverFlag")); model.setServerVersion(object.getString("serverVersion")); model.setUpdateurl(object.getString("updateurl")); model.setUpgradeinfo(object.getString("upgradeinfo")); tmpMap.put(DeliverConsts.KEY_APP_UPDATE, model); } catch (JSONException e) { e.printStackTrace(); } //发送广播 sendBroadcast(new Intent(UpdateReceiver.UPDATE_ACTION)); } });当然了,我们也要注册和结束广播: /** * 广播注册 */ private void registerBroadcast() { mUpdateReceiver = new UpdateReceiver(false); mIntentFilter = new IntentFilter(UpdateReceiver.UPDATE_ACTION); this.registerReceiver(mUpdateReceiver, mIntentFilter); } /** * 广播卸载 */ private void unRegisterBroadcast() { try { this.unregisterReceiver(mUpdateReceiver); } catch (Exception e) { e.printStackTrace(); } }接下来我们看下我们自定义的广播接收者UpdateReceiver .java:public class UpdateReceiver extends BroadcastReceiver { private AlertDialog.Builder mDialog; public static final String UPDATE_ACTION = "wuyinlei_aixinwen"; private SharedPreferencesHelper mSharedPreferencesHelper; private boolean isShowDialog; public UpdateReceiver() { } public UpdateReceiver(boolean isShowDialog) { super(); this.isShowDialog = isShowDialog; } @Override public void onReceive(Context context, Intent intent) { mSharedPreferencesHelper = mSharedPreferencesHelper .getInstance(MyApplication.getInstance()); //当然了,这里也可以直接new处hashmap HashMap tempMap = MyApplication.getInstance() .getTempMap(); UpdateInfoModel model = (UpdateInfoModel) tempMap //就是一个标志 .get(DeliverConsts.KEY_APP_UPDATE); try { /** * 获取到当前的本地版本 */ UpdateInformation.localVersion = MyApplication .getInstance() //包管理独享 .getPackageManager() //包信息 .getPackageInfo( MyApplication.getInstance() .getPackageName(), 0).versionCode; /** * 获取到当前的版本名字 */ UpdateInformation.versionName = MyApplication .getInstance() .getPackageManager() .getPackageInfo( MyApplication.getInstance() .getPackageName(), 0).versionName; } catch (Exception e) { e.printStackTrace(); } //app名字 UpdateInformation.appname = MyApplication.getInstance() .getResources().getString(R.string.app_name); //服务器版本 UpdateInformation.serverVersion = Integer.parseInt(model .getServerVersion()); //服务器标志 UpdateInformation.serverFlag = Integer.parseInt(model.getServerFlag()); //强制升级 UpdateInformation.lastForce = Integer.parseInt(model.getLastForce()); //升级地址 UpdateInformation.updateurl = model.getUpdateurl(); //升级信息 UpdateInformation.upgradeinfo = model.getUpgradeinfo(); //检查版本 checkVersion(context); } /** * 检查版本更新 * * @param context */ public void checkVersion(Context context) { if (UpdateInformation.localVersion < UpdateInformation.serverVersion) { // 需要进行更新 mSharedPreferencesHelper.putIntValue( //有新版本 SharedPreferencesTag.IS_HAVE_NEW_VERSION, 1); //更新 update(context); } else { mSharedPreferencesHelper.putIntValue( SharedPreferencesTag.IS_HAVE_NEW_VERSION, 0); if (isShowDialog) { //没有最新版本,不用升级 noNewVersion(context); } clearUpateFile(context); } } /** * 进行升级 * * @param context */ private void update(Context context) { if (UpdateInformation.serverFlag == 1) { // 官方推荐升级 if (UpdateInformation.localVersion < UpdateInformation.lastForce) { //强制升级 forceUpdate(context); } else { //正常升级 normalUpdate(context); } } else if (UpdateInformation.serverFlag == 2) { // 官方强制升级 forceUpdate(context); } } /** * 没有新版本 * @param context */ private void noNewVersion(final Context context) { mDialog = new AlertDialog.Builder(context); mDialog.setTitle("版本更新"); mDialog.setMessage("当前为最新版本"); mDialog.setNegativeButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).create().show(); } /** * 强制升级 ,如果不点击确定升级,直接退出应用 * * @param context */ private void forceUpdate(final Context context) { mDialog = new AlertDialog.Builder(context); mDialog.setTitle("版本更新"); mDialog.setMessage(UpdateInformation.upgradeinfo); mDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent mIntent = new Intent(context, UpdateService.class); mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mIntent.putExtra("appname", UpdateInformation.appname); mIntent.putExtra("appurl", UpdateInformation.updateurl); //启动服务 context.startService(mIntent); } }).setNegativeButton("退出", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 直接退出应用 //ManagerActivity.getInstance().finishActivity(); System.exit(0); } }).setCancelable(false).create().show(); } /** * 正常升级,用户可以选择是否取消升级 * * @param context */ private void normalUpdate(final Context context) { mDialog = new AlertDialog.Builder(context); mDialog.setTitle("版本更新"); mDialog.setMessage(UpdateInformation.upgradeinfo); mDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent mIntent = new Intent(context, UpdateService.class); mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //传递数据 mIntent.putExtra("appname", UpdateInformation.appname); mIntent.putExtra("appurl", UpdateInformation.updateurl); context.startService(mIntent); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).create().show(); } /** * 清理升级文件 * * @param context */ private void clearUpateFile(final Context context) { File updateDir; File updateFile; if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { updateDir = new File(Environment.getExternalStorageDirectory(), UpdateInformation.downloadDir); } else { updateDir = context.getFilesDir(); } updateFile = new File(updateDir.getPath(), context.getResources() .getString(R.string.app_name) + ".apk"); if (updateFile.exists()) { Log.d("update", "升级包存在,删除升级包"); updateFile.delete(); } else { Log.d("update", "升级包不存在,不用删除升级包"); } }}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 一步一步实现版本自动更新(第一步 解析是否需要更新)

思路: 1、在tomcat上放置xml文件,文件里存放最新的版本号信息,客户端通过http的方式访问xml文件来获取最近的版本信息; 2、客户端比对版本信息来判断是否需要更新;   由于通过网络来访问...
  • windvally
  • windvally
  • 2015年02月16日 15:00
  • 831

讯飞自动更新封装

友盟自动更新关闭了,公司不想自己做一个更新系统,各种精挑细选下,我选择了讯飞,并封装了一下 必需的,要申请个讯飞账号,创建个应用,开通自动更新服务,这些不详谈,以下记录如何使用 1:添加讯飞更新ja...
  • lianwanfei
  • lianwanfei
  • 2016年07月14日 10:43
  • 1233

ActiveX控件版本自动更新问题的解决方案

     发布一个ActiveX给客户后,后期的维护中进行更新后需要再次发布到客户机器上,因此需要控件进行版本的自动更新。这里假设原始版本号为1,0,0,1,修改后的版本号为1,0,0,2。   ...
  • phinecos
  • phinecos
  • 2009年03月03日 12:41
  • 1576

eclipse自动更新svn方法

1、下载最新的Eclipse,我的版本是3.7.2 indigo(Eclipse IDE for Java EE Developers)版     如果没有安装的请到这里下载安装:http://ec...
  • u012992462
  • u012992462
  • 2015年06月10日 17:29
  • 787

Android如何实现APP自动更新

先来看看要实现的效果图: 对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的...
  • Derbe
  • Derbe
  • 2016年11月17日 11:02
  • 6444

有关JDK版本自动升级、java环境变量的问题

     今天项目组程序联调的时候,在同事们的机器上程序运行得都好好的,唯独在我这死活运行不正确,经过再三查找原因,发现是我的jdk版本比他们低的原因,于是更新了jdk,随即问题得到了解决。但是在这个...
  • natian306
  • natian306
  • 2010年04月02日 16:33
  • 20353

ASP 程序实现自动升级功能

 现在流行虚拟主机建站,我也有个网站,也算是个站长咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本地,解压,FTP上传到虚拟主机。这些都是累人的体力活,加之...
  • lake2
  • lake2
  • 2006年05月28日 00:10
  • 6885

简单实现安卓app自动更新功能

实现简单安卓app自动更新: 1.服务端提供接口 2.客户端获取接口数据,解析,获取最新版本信息 3.安装最新版本...
  • wuyinlei
  • wuyinlei
  • 2016年03月01日 13:25
  • 14273

自动更新版本

1,验证版本C# code staticvoid Main() { Application.EnableVisualStyles(); Applic...
  • leadingzsx
  • leadingzsx
  • 2010年06月30日 11:19
  • 75

C# 实现客户端程序自动更新

由于微软提供的更新程序使用不方便,所以又写了此程序。此程序是本人一年前所写的一段程序,当时在开发一个CS版本报价系统,当时由于开发过程仓促,代码可能有点不是太规范此程序编译后只有一下AutoUpdat...
  • a389483637
  • a389483637
  • 2014年06月10日 09:12
  • 1683
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何自动更新版本
举报原因:
原因补充:

(最多只允许输入30个字)