第一步 服务器端: 服务端提供一个借口,或者网址,我这里就用的服务器是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", "升级包不存在,不用删除升级包"); } } }
版本号升级
最新推荐文章于 2021-05-28 23:23:04 发布