Android 自动更新APK

   <pre name="code" class="java">第一次写博客,可能很多地方没表述清楚,请大家一定提出,我会多加改正,让博客的质量越来越好,下面直奔主题:
基本上每个应用都有这个功能:版本更新,当然我们公司的应用也不例外,由于我也是才接触Android,所以借鉴了许多前辈的方法,结合自己的了解和网上查阅的资料,总结了版本更新的主要逻辑如下:
   1:获取当前应用的版本号、版本名称等
   2:用当前版本号和原来的进行对比
   3:如果版本相同,这提示是最新版本,不相同则去下载新的apk
   4:用新的apk替换掉原来的apk,
下面分别介绍,粗糙代码,多多包涵
   
1:获取版本等:
	/**
	 * 获取当前版本号
	 */
	public int getVersionCode() throws Exception {
		// 获取PackageManager的实例
		PackageManager packageManager = getPackageManager();
		// getPackageName()是你当前类的包名,0代表是获取版本信息
		PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),
				0);
		return packInfo.versionCode;
	}

	/**
	 * 获取当前版本名称
	 */
	public String getVersionName() throws Exception {
		// 获取PackageManager的实例
		PackageManager packageManager = getPackageManager();
		// getPackageName()是你当前类的包名,0代表是获取版本信息
		PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),
				0);
		return packInfo.versionName;
	}
  
   2:对比版本号
	/**
	 * 从服务器获取XML文件解析并进行对比版本号
	 */
	public void checkUpdate() {
		try {
			// XML文件的路径
			String path = getResources().getString(R.string.serverurl);
			// 包装成URL对象
			URL url = new URL(path);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			// 获取写入流对象
			InputStream is = conn.getInputStream();
			info = UpdataInfoManager.getUpdataInfo(is);
			// 获取版本号
			versionname = getVersionName();
			// 版本号相同,无需升级
			if (info.getVersion().equals(versionname)) {
				pro_Dialog.dismiss();
				thread = new Thread(runnable);
				thread.start();
			}
			// 版本号不同,提示用户升级
			else {
				Message msg = new Message();
				msg.what = UPDATA_CLIENT;
				handler.sendMessage(msg);
			}
		} catch (Exception e) {
			// 待处理
			Message msg = new Message();
			msg.what = GET_UNDATAINFO_ERROR;
			handler.sendMessage(msg);
			e.printStackTrace();
		}

	}
   3:下载新的apk
	/**
	 * 下载更新的方法
	 */
	protected void downLoadApk() {
		// 得到更新地址
		final String path = info.getUrl();
		// 创建更新对话框
		pd = new ProgressDialog(this);
		pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		pd.setMessage("正在下载更新");
		pd.show();
		// 创建线程开始更新
		new Thread() {
			@Override
			public void run() {
				try {
					file = getFileFromServer(path, pd);
				} catch (Exception e) {
					// 创建消息对象
					Message msg = new Message();
					msg.what = DOWN_ERROR;
					// 将消息发送出去
					handler.sendMessage(msg);
					e.printStackTrace();
				}
			}
		}.start();
	}
	/**
	 * 下载更新
	 * @param path
	 * @param pd
	 * @return file
	 * @throws Exception
	 */
	public File getFileFromServer(String path, ProgressDialog pd)
			throws Exception {
		URL url = new URL(path);
		conn = (HttpURLConnection) url.openConnection();
		conn.setConnectTimeout(5000);
		pd.setMax(100);
		is = conn.getInputStream();
		// 定义File用来存放apk
		File file = new File(Environment.getExternalStorageDirectory(),
				"main.apk");
		// 判断文件是否存在,不存在则重新创建
		if (!file.exists()) {
			file.createNewFile();
		}
		// 否则就删除
		else {
			file.delete();
		}
		// 获取读写流对象
		fos = new FileOutputStream(file);
		bis = new BufferedInputStream(is);
		byte[] buffer = new byte[1024];
		// 定义变量表示下载的进度
		int len = 0;
		int cur = 0;
		// 获取文件大小
		int total = conn.getContentLength();
		while ((len = bis.read(buffer)) != -1) {
			fos.write(buffer, 0, len);
			cur += len;
			// 获取当前下载量
			progress = (int) (((float) cur / total) * 100);
			handler.sendEmptyMessage(DOWNLOAD_ING);
		}
		if (len == -1) {
			handler.sendEmptyMessage(DOWNLOAD_OVER);
		}
		// 关闭读写流
		fos.close();
		bis.close();
		is.close();
		return file;
	}
	// 声明Handler接口用来判断更新状态
	Handler handler = new Handler() {
		@SuppressLint("HandlerLeak")
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case UPDATA_CLIENT:
				pro_Dialog.dismiss();
				// 对话框提示用户升级
				showUpdataDialog();
				break;
			case DOWNLOAD_ING:
				// 显示下载进度条
				pd.setProgress(progress);
				break;
			case GET_UNDATAINFO_ERROR:
				pro_Dialog.dismiss();
				// 服务器超时
				Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1)
						.show();
				thread = new Thread(runnable);
				thread.start();
				break;
			case DOWN_ERROR:
				// 下载apk失败
				Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();
				break;
			case DOWNLOAD_OVER:
				// 下载apk成功
				Toast.makeText(VersionActivity.this, "下载完成", 1).show();
				pd.dismiss();
				// 安装apk
				installApk(file);
				break;
			}
		}
	};
	
    4:最后就是替换成最新apk了	
	/**
	 * 安装apk的方法
	 * @param file
	 */
	protected void installApk(File file) {
		Intent intent = new Intent();
		// 执行动作
		intent.setAction(Intent.ACTION_VIEW);
		// 得到apk的路径
		String openPath = Environment.getExternalStorageDirectory() + "/"
				+ "main.apk";
		// 执行的数据类型
		intent.setDataAndType(Uri.parse("file://" + openPath),
				"application/vnd.android.package-archive");
		this.startActivity(intent);
	}

以上就是我学到的更新版本的东西了,我也是站在巨人的肩膀上看世界,感谢那些无私奉献的程序员们。
希望我的技术越来越好,博客也越写越好。

 
</pre><pre class="java" name="code">
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值