自动版本检测更新

来源:互联网 发布:sass 编译软件 编辑:程序博客网 时间:2024/05/16 19:49

主界面登录自动检查更新

 checkupdateagent.addListener(checkUpDate); checkupdateagent.start();

Agent版本获取服务端版本信息

public class CheckUpdateAgent extends AbstractAgent<String> {    public static final String KEY_VERSION = "version";    public static final String KEY_URL = "url";    public static String desc;    private int sleepMiSec = 4000;    public CheckUpdateAgent(){        this(3000);    }    public CheckUpdateAgent(int sleepMiSec){        this.sleepMiSec = sleepMiSec;    }    @Override    protected String doExecute() throws HttpRPCException {        try {            new TimeFairy(sleepMiSec).sleepIfNecessary();            URL updateURL = new URL(AppUtil.getUpdateURL());            HttpURLConnection conn = (HttpURLConnection) updateURL.openConnection();            Properties props = new Properties();            props.load(conn.getInputStream());            String version = props.getProperty(KEY_VERSION);            String  url=null;            if(AppUtil.shouldUpdateToNewVersion(version)){                url = props.getProperty(KEY_URL);                desc=props.getProperty("desc");            }            return url;        } catch (Exception ex) {            throw new HttpRPCException(ex.getMessage(), 0, ex);        }    }}

工具APPUtil,版本判断,

 public static boolean shouldUpdateToNewVersion(String serverVersion) {        String[] curVersions = versionName.split("[.]");        String[] serverVersions = serverVersion.split("[.]");        for (int i = 0; i < 3; i++) {            int curVersion = Integer.parseInt(curVersions[i]);            int servVersion = Integer.parseInt(serverVersions[i]);            if (curVersion > servVersion) {                return false;            } else if (curVersion < servVersion) {                return true;            }        }        return false;    }

监听返回

 /**     * 获取更新数据监听     */    private AgentListener<String> checkUpDate = new AgentListener<String>() {        @Override        public void onStarted(long seq) {        }        @Override        public void onSucceeded(String info, long seq) {            if(info!=null) {                updateManager = new UpdateManager(MainAct.this, info);                showUpDate();            }        }        @Override        public void onFailed(String errMsg, int errCode, long seq) {            ViewUtil.showToast("更新失败,请重使");        }    };

弹窗更新与否

  /**     * 更新提示框     */    private void showUpDate() {        AlertDialog.Builder builder = new AlertDialog.Builder(MainAct.this);        builder.setMessage("检测到新版本,确认安装吗?");        builder.setTitle("更新信息");        builder.setPositiveButton("立刻安装", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();                updateManager.checkUpdateInfo();            }        });        builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();            }        });        builder.show();    }

下载UpdateManager

下载完成自动安装

public class UpdateManager  {    /* 下载包安装路径 */    private static final String savePath = "/sdcard/yzxd/";    private static final String saveFileName = savePath + "yzxd.apk";    private Context mContext;    //返回的安装包url    private String apkUrl="";    private Dialog downloadDialog;    /* 进度条与通知ui刷新的handler和msg常量 */    private ProgressBar mProgress;    private static final int DOWN_UPDATE = 1;    private static final int DOWN_OVER = 2;    private int progress;    private Thread downLoadThread;    private boolean interceptFlag = false;    private Handler mHandler = new Handler(){        public void handleMessage(Message msg) {            switch (msg.what) {                case DOWN_UPDATE:                    mProgress.setProgress(progress);                    break;                case DOWN_OVER:                    downloadDialog.dismiss();                    installApk();                    break;                default:                    break;            }        };    };    public UpdateManager(Context context, String apkUrl) {        this.mContext = context;        this.apkUrl=apkUrl;    }    //外部接口让主Activity调用    public void checkUpdateInfo(){        showDownloadDialog();    }    private void showDownloadDialog(){        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);        builder.setTitle("正在下载更新");        final LayoutInflater inflater = LayoutInflater.from(mContext);        View v = inflater.inflate(R.layout.progress, null);        mProgress = (ProgressBar)v.findViewById(R.id.progress);        builder.setView(v);        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();                interceptFlag = true;            }        });        downloadDialog = builder.create();        downloadDialog.show();        downloadApk();    }    private Runnable mdownApkRunnable = new Runnable() {        @Override        public void run() {            try {                URL url = new URL(apkUrl);                HttpURLConnection conn = (HttpURLConnection)url.openConnection();                conn.connect();                int length = conn.getContentLength();                InputStream is = conn.getInputStream();                File file = new File(savePath);                if(!file.exists()){                    file.mkdir();                }                String apkFile = saveFileName;                File ApkFile = new File(apkFile);                FileOutputStream fos = new FileOutputStream(ApkFile);                int count = 0;                byte buf[] = new byte[1024];                do{                    int numread = is.read(buf);                    count += numread;                    progress =(int)(((float)count / length) * 100);                    //更新进度                    mHandler.sendEmptyMessage(DOWN_UPDATE);                    if(numread <= 0){                        //下载完成通知安装                        mHandler.sendEmptyMessage(DOWN_OVER);                        break;                    }                    fos.write(buf,0,numread);                }while(!interceptFlag);//点击取消就停止下载.                fos.close();                is.close();            } catch (MalformedURLException e) {                e.printStackTrace();            } catch(IOException e){                e.printStackTrace();            }        }    };    /**     * 下载apk     * @param     */    private void downloadApk(){        downLoadThread = new Thread(mdownApkRunnable);        downLoadThread.start();    }    /**     * 安装apk     * @param     */    private void installApk(){        File apkfile = new File(saveFileName);        if (!apkfile.exists()) {            return;        }        Intent i = new Intent(Intent.ACTION_VIEW);        i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");        mContext.startActivity(i);    }}
3 0