版本更新的写法

在maiAcitity里面写
public class MainActivity extends Activity {

	private AlertDialog dialog;

	private UpdateEntity updateEntity;

	private TextView tv_name;
	/**
	 * 消息机制
	 */
	private Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);

			switch (msg.what) {
				case 0:
					dialog.setMessage(updateEntity.getDescription());
					dialog.show();
					break;

				case 1:
					downLoadApk();
					break;
			}


		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		dialog = new AlertDialog.Builder(MainActivity.this).
				setTitle("升级提醒").
				setIcon(R.drawable.ic_launcher).
				setPositiveButton("在线升级", onclick).
				setNegativeButton("不想升级", null).
				create();



		//开启线程
		new Thread(new CheckVersionTask()).start();
	}

	DialogInterface.OnClickListener  onclick = new DialogInterface.OnClickListener(){

		@Override
		public void onClick(DialogInterface dialog, int which) {
			// TODO Auto-generated method stub
			handler.sendEmptyMessage(1);
		}

	};

	/*
	 * 从服务器中下载APK
	 */
	protected void downLoadApk() {
		final ProgressDialog pd;    //进度条对话框
		pd = new  ProgressDialog(this);
		pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		pd.setMessage("正在下载更新");
		pd.show();
		new Thread(){
			@Override
			public void run() {
				try {
					File file =  getFileFromServer(updateEntity.getUrl(), pd);
					sleep(3000);

					UpdateTools tools = new UpdateTools();
					//安装APk
					tools.installApk(file,MainActivity.this);
					pd.dismiss(); //结束掉进度条对话框

				} catch (Exception e) {
					e.printStackTrace();
				}
			}}.start();
	}

	/*
	 * 从服务器获取xml解析并进行比对版本号
	 */
	public class CheckVersionTask implements Runnable{

		public void run() {
			try {
				//从资源文件获取服务器 地址
				String path = getResources().getString(R.string.serverurl);
				//包装成url的对象
				URL url = new URL(path);
				HttpURLConnection conn =  (HttpURLConnection) url.openConnection();
				conn.setConnectTimeout(5000);
				InputStream is =conn.getInputStream();
				updateEntity =  UpdateTools.getUpdataInfo(is);

				int versionCode = MainActivity.this.getPackageManager().getPackageInfo(MainActivity.this.getPackageName(), 0).versionCode;

				if(Integer.parseInt(updateEntity.getVersion()) <= versionCode){
					Log.i("xxx","版本号相同无需升级");
				}else{
					Log.i("xxxx","版本号不同 ,提示用户升级 ");
					handler.sendEmptyMessage(0);

				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 下载方法
	 *
	 * @param path
	 * @param pd
	 * @return
	 * @throws Exception
	 */
	public File getFileFromServer(String path, ProgressDialog pd)
			throws Exception {
		// 如果相等的话表示当前的sdcard挂载在手机上并且是可用的
		if (Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED)) {
			URL url = new URL(path);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(5000);
			// 获取到文件的大小
			pd.setMax(conn.getContentLength());
			InputStream is = conn.getInputStream();
			File file = new File(Environment.getExternalStorageDirectory(),
					"updata.apk");
			FileOutputStream fos = new FileOutputStream(file);
			BufferedInputStream bis = new BufferedInputStream(is);
			byte[] buffer = new byte[1024];
			int len;
			int total = 0;
			while ((len = bis.read(buffer)) != -1) {
				fos.write(buffer, 0, len);
				total += len;
				// 获取当前下载量
				pd.setProgress(total);
			}
			fos.close();
			bis.close();
			is.close();
			return file;
		} else {
			return null;
		}
	}

	@Override
	protected void onPause() {
		Log.w(Conf.TAG, "Activity1.onPause()");
		// TODO Auto-generated method stub
		super.onPause();

	}

	@Override
	protected void onResume() {
		Log.w(Conf.TAG, "Activity1.onResume()");
		// TODO Auto-generated method stub
		super.onResume();

	}


}

UpdateEntity类写法:

/**
 * 版本更新信息的封装
 *
 * @author dagang
 *
 */
public class UpdateEntity {
	private String version;

	private String url;

	private String description;

	public String getVersion() {
		return version;
	}

	public void setVersion(String version) {
		this.version = version;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}





}
UpdateTools类写法

/**
 *
 * 获取服务器的更新内容
 *
 * 当前版本
 *
 * apk的路径
 *
 * 更新细则
 *
 * @author dagang
 *
 */
public class UpdateTools {
	/*
	 * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号)
	 */
	public static UpdateEntity getUpdataInfo(InputStream is) throws Exception {
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(is, "utf-8");// 设置解析的数据源
		int type = parser.getEventType();
		UpdateEntity info = new UpdateEntity();// 实体
		while (type != XmlPullParser.END_DOCUMENT) {
			switch (type) {
				case XmlPullParser.START_TAG:
					if ("version".equals(parser.getName())) {
						info.setVersion(parser.nextText()); // 获取版本号
					} else if ("url".equals(parser.getName())) {
						info.setUrl(parser.nextText()); // 获取要升级的APK文件
					} else if ("description".equals(parser.getName())) {
						info.setDescription(parser.nextText()); // 获取该文件的信息
					}
					break;
			}
			type = parser.next();
		}
		return info;
	}

	/**
	 *
	 * 安装Apk
	 *
	 * @param file
	 * @param context
	 */
	public void installApk(File file,Context context) {
		Intent intent = new Intent();
		//执行动作
		intent.setAction(Intent.ACTION_VIEW);
		//执行的数据类型
		intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
		context.startActivity(intent);
	}
}
在value里面的string添加:
  
    http://169.254.172.144:8080/goods_file/update_file.xml




你可能感兴趣的:(版本更新)