版本更新

在做版本更新之前需要准备实体类和工具类

实体类UpdateEntity.java

package com.beicai.update;
/**
 * 版本更新信息的封装
 * 
 * 
 *
 */
public class UpdateEntity {
	private String version;//版本号
	
	private String url;//apk的下载地址
	
	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.java
package com.beicai.update;

import java.io.File;
import java.io.InputStream;

import org.xmlpull.v1.XmlPullParser;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Xml;

/**
 * 
 * 获取服务器的更新内容
 * 
 * 当前版本
 * 
 * apk的路径
 * 
 * 更新细则
 * 
 * 
 * 
 */
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);  
	}  
}

接下来进入主题 进行版本更新  MainActivity.java

package com.beicai.update;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

import com.baidu.mobstat.StatService;
//1,进入 请求服务器  xml文件 
//2,读取xml文件信息  。取出版本号   ,apk的下载地址
//3,比较当前app的版本号和xml中版本号的大小,如果当前app《服务器版本号则下载 否则不弹出框
//4,如果要下载,则需要取出xml中的下载地址,然后下载apk ,存入到sd卡上 
//5,安装下载好的apk
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) {
			 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 = "服务器的xml文件地址";    
	            //包装成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() {
		// TODO Auto-generated method stub
		super.onPause();
	
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
	
	}
	
	
}

必需的权限

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
	<!-- 必须申明的权限 -->
	<uses-permission android:name="android.permission.INTERNET"></uses-permission>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
	<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
	<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>

请根据需求修改实体类和工具类,希望能帮到你,如果是解析的是json文件请自己写实体类,并适当修改工具类

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值