获取版本号完成版本更新的过程步骤方法流程及Xutils的使用(项目实战学习总结)

本文详细介绍了在Android中获取应用版本号和版本名称的步骤,并通过Xutils实现自动更新,包括导入Xutils库、设置权限、使用HttpUtils下载APK、处理应用覆盖安装时的签名与包名问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取版本名称及版本号【在清单文件中】

 <!-- android:versionCode="1"本地应用版本号1,版本号是2,有必要提示用户更新 -->
<!-- android:versionName="1.1.0";第一位表示项目重大更新(代码重构,大部分功能添加,界面整体修改),第二位表示更新部分功能,第一位表示修复原有的bug -->

首先我们先获取当前的版本号及版本名称(三步骤)

      1、包管理者对象packageManager 
        PackageManager pm = getPackageManager()
    2、从包的管理者对象中,获取指定包名的基本信息(版本名称,版本号),传0代表获取基本信息
       PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
      3、获取版本名称
      return packageInfo.versionCode/versionName;

进而我们通过解析获取我们服务器版本号(客户端发请求,服务端给响应,(json,xml))
 (json.xml中内容包含:更新版本的版本名称 新版本的描述信息 服务器版本号 新版本apk下载地址)
 
private void checkVerSion() {
		new Thread() {

			public void run() {
				Message msg = Message.obtain();
				long startTime = System.currentTimeMillis();
				try {
					// 1.封装一个url地址
					URL url = new URL("http://192.168.0.104:8080/update.json");

					// 2.开启一个url链接
					HttpURLConnection urlConnection = (HttpURLConnection) url
							.openConnection();
					// 3.设置常见的请求参数(请求头)
					// 请求超时
					urlConnection.setConnectTimeout(2000);
					// 读取超时
					urlConnection.setReadTimeout(2000);
					// 4.获取响应码
					if (urlConnection.getResponseCode() == 200) {
						InputStream is = urlConnection.getInputStream();
						String json = StreamUtil.streamToString(is);
						Log.i(tag, json);

						JSONObject jsonObject = new JSONObject(json);
						String versionName = jsonObject
								.getString("versionName");
						String versionCode = jsonObject
								.getString("versionCode");
						mVersionDes = jsonObject.getString("versionDes");
						mDownloadUrl = jsonObject.getString("downloadUrl");
						Log.i(tag, versionName);
						Log.i(tag, versionCode);
						Log.i(tag, mVersionDes);
						Log.i(tag, mDownloadUrl);
						// 8、比对版本号
						if (mLocalVerSionCode < Integer.parseInt(versionCode)) {
							// 提示用户更新,弹出对话框
							msg.what = UPDATE_CODE;
						} else {
							// 进入应用主界面
							msg.what = ENTER_HOME;
						}

					}

				} catch (MalformedURLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					msg.what = URL_ERROR;
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					msg.what = IO_ERROR;
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					msg.what = JSON_ERROR;
				} finally {
					long endTime = System.currentTimeMillis();
					if ((startTime - endTime) < 4000) {
						try {
							Thread.sleep(4000 - (startTime - endTime));
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					mHandler.sendMessage(msg);
				}
			}

		}.start();

	}

Xutils使用过程
  1. 导入Xutils的jar包
  2. 添加Xutils需要的权限
  3. 获取HttpUtils对象,下载指定地址的APK
     
    
protected void downloadApk() {
  //apk下载链接地址,放置apk的所在路径
  
  //1,判断sd卡是否可用,是否挂在上
  if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
   //2,获取sd路径
   String path = Environment.getExternalStorageDirectory().getAbsolutePath()
     +File.separator+"Mymobilesafe.apk";
   //3,发送请求,获取apk,并且放置到指定路径
   HttpUtils httpUtils = new HttpUtils();
   //4,发送请求,传递参数(下载地址,下载应用放置位置)
   httpUtils.download(mDownloadUrl, path, new RequestCallBack() {
    @Override
    public void onSuccess(ResponseInfo responseInfo) {
     //下载成功(下载过后的放置在sd卡中apk)
     Log.i(tag, "下载成功");
     File file = responseInfo.result;
     //提示用户安装
     installApk(file);
    }
    @Override
    public void onFailure(HttpException arg0, String arg1) {
     Log.i(tag, "下载失败");
     //下载失败
    }
    //刚刚开始下载方法
    @Override
    public void onStart() {
     Log.i(tag, "刚刚开始下载");
     super.onStart();
    }
    
    //下载过程中的方法(下载apk总大小,当前的下载位置,是否正在下载)
    @Override
    public void onLoading(long total, long current,boolean isUploading) {
     Log.i(tag, "下载中........");
     Log.i(tag, "total = "+total);
     Log.i(tag, "current = "+current);
     super.onLoading(total, current, isUploading);
    }
   });
   
  }
 }
 /**
  * 安装对应的apk
  */
 protected void installApk(File file) {
  //系统应用界面,源码,安装apk入口
  Intent intent = new Intent("android.intent.action.VIEW");
  intent.addCategory("android.intent.category.DEFAULT");
  //文件作为数据源
  //设置安装的类型 
  intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
   startActivityForResult(intent, 0);
  
 }
 /* 
  *  
  *  开启一个activity后,返回结果调用的方法
  */
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  enterhome();
  super.onActivityResult(requestCode, resultCode, data);
 }          




打包生成apk的过程
Android Tools——Export Signed Application Packagee

安装apk的过程注意事项
  • 将原有应用覆盖文件,包名一致
  • 签名一致(从Eclipse运行至手机上的应用,使用的是bin目录下的应用,使用debug.keyStore签名应用)
  • 签名一致,包名不同(生成俩个APK,包名是应用的唯一性标志)
  • 签名不同,包名一致,覆盖安装失败

   安装对应apk
       
	protected void installApk(File file) {
		//系统应用界面,源码,安装apk入口
		Intent intent = new Intent("android.intent.action.VIEW");
		intent.addCategory("android.intent.category.DEFAULT");
		//文件作为数据源
		//设置安装的类型 
		intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
 		startActivityForResult(intent, 0);
	 
	}
 

目前xUtils主要有四大模块: DbUtils模块: android中的orm框架,一行代码就可以进行增删改查; 支持事务,默认关闭; 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名); 支持绑定外键,保存实体时外键关联实体自动保存或更新; 自动加载外键关联实体,支持延时加载; 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。 ViewUtils模块: android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定; 新的事件绑定方式,使用混淆工具混淆后仍可正常工作; 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。 HttpUtils模块: 支持同步,异步方式的请求; 支持大文件上传,上传大文件不会oom; 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求; 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件; 返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。 BitmapUtils模块: 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象; 支持加载网络图片和本地图片; 内存管理使用lru算法,更好的管理bitmap内存; 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等... 使用xUtils快速开发框架需要有以下权限: 混淆时注意事项: 添加Android默认混淆配置${sdk.dir}/tools/proguard/proguard-android.txt 不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; } 对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name="xxx"),@Id(column="xxx"),@Column(column="xxx"),@Foreign(column="xxx",foreign="xxx");收缩
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值