Android版本更新

https://files.cnblogs.com/xiaxiaoli/version.xml

https://files.cnblogs.com/xiaxiaoli/Version.apk

 

给大家提供一个Android版本更新的demo,如下:

Version.zip

源代码:

package com.android;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.xmlpull.v1.XmlPullParser;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Xml;

public class UpdateVersion {
    public final String TAG = this.getClass().getName();
    public final static int UPDATA_NONEED = 0;
    public final static int UPDATA_CLIENT = 1;
    public final static int GET_UNDATAINFO_ERROR = 2;
    public final static int SDCARD_NOMOUNTED = 3;
    public final static int DOWN_ERROR = 4;
    public final static int UPDATA_CLIENT_FORCE = 5;
    private UpdataInfo info;
    private int localVerCode = -1;
    private CheckVersionTask cv;
    private Thread mThread;
    private String urlStr;
    private Handler handler;
    private ProgressDialog progressDialog;
    private Context mContext;
    public UpdateVersion(Context context, String url, Handler handler) {
        super();
        this.handler = handler;
        this.urlStr = url;
        this.mContext = context;
        progressDialog = ProgressDialog.show(mContext, "", "正在检测,请稍后..");
        progressDialog.setCancelable(true);
        progressDialog.setCanceledOnTouchOutside(false);
    }
    public void setLocalVerCode(int vercode){
        this.localVerCode = vercode;
    }
    public void start(){
        cv = new CheckVersionTask();
        mThread = new Thread(cv);
        mThread.start();
    }
    /*
     * 从服务器获取xml解析并进行比对版本号
     */
    public class CheckVersionTask implements Runnable {

        public void run() {
            try {
                URL url = new URL(urlStr);
                HttpURLConnection conn = (HttpURLConnection) url
                        .openConnection();
                conn.setConnectTimeout(5000);
                InputStream is = conn.getInputStream();
                info = getUpdataInfo(is);
                progressDialog.dismiss();
                Message msg = new Message();
                if (Integer.parseInt(info.getVercode()) > localVerCode) {
                    if (info.getForce() == 1) {
                        msg.what = UPDATA_CLIENT_FORCE;
                    }else {
                        msg.what = UPDATA_CLIENT;
                    }
                } else {
                    msg.what = UPDATA_NONEED;
                }
                msg.obj = info;
                handler.sendMessage(msg);
                
            } catch (Exception e) {
                // 待处理
                Message msg = new Message();
                msg.what = GET_UNDATAINFO_ERROR;
                msg.obj = info;
                handler.sendMessage(msg);
                e.printStackTrace();
            }
        }
    }
    
    /*
     * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号)
     */
    public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{
        XmlPullParser parser = Xml.newPullParser();  
        parser.setInput(is, "utf-8");//设置解析的数据源 
        int type = parser.getEventType();
        UpdataInfo info = new UpdataInfo();//实体
        while(type != XmlPullParser.END_DOCUMENT ){
            switch (type) {
            case XmlPullParser.START_TAG:
                if("vercode".equals(parser.getName())){
                    info.setVercode(parser.nextText());    //获取版本号
                }else if ("vername".equals(parser.getName())){
                    info.setVername(parser.nextText());    //获取版本名称
                }else if ("url".equals(parser.getName())){
                    info.setUrl(parser.nextText());    //获取要升级的APK文件
                }else if ("appname".equals(parser.getName())){
                    info.setAppname(parser.nextText());    //获取app名称
                }else if ("apkname".equals(parser.getName())){
                    info.setApkname(parser.nextText());    //获取apk名称
                }else if ("force".equals(parser.getName())){
                    info.setForce(Integer.parseInt(parser.nextText()));    //获取apk名称
                }
                break;
            }
            type = parser.next();
        }
        return info;
    }

}
View Code

 

posted on 2013-07-31 11:20  Eysin  阅读(271)  评论(0)    收藏  举报

导航