实现的逻辑,创建一个UpdateManager类,单例模式构建。 第一步网络请求检测是否有更新,通过Handler对象发送消息,提示检测结果或者是否下载。

第二步下载安装包,通过Handler对象发送消息,更新进度条和完成后进行安装。下载的时候先放进临时文件,下载完成后改成正式的安装包名字。

/** * 应用程序更新工具包 */public class UpdateManager {    private static final int DOWN_NOSDCARD = 0;    private static final int DOWN_UPDATE = 1;    private static final int DOWN_OVER = 2;    private static final int DIALOG_TYPE_LATEST = 0;    private static final int DIALOG_TYPE_FAIL   = 1;    private static UpdateManager updateManager;    private Context mContext;    //通知对话框    private Dialog noticeDialog;    //下载对话框    private Dialog downloadDialog;    //'已经是最新' 或者 '无法获取最新版本' 的对话框    private Dialog latestOrFailDialog;    //进度条    private ProgressBar mProgress;    //显示下载数值    private TextView mProgressText;    //查询动画    private ProgressDialog mProDialog;    //进度值    private int progress;    //下载线程    private Thread downLoadThread;    //终止标记    private boolean interceptFlag;    //提示语    private String updateMsg = "";    //返回的安装包url    private String apkUrl = "";    //下载包保存路径    private String savePath = "";    //apk保存完整路径    private String apkFilePath = "";    //临时下载文件路径    private String tmpFilePath = "";    //下载文件大小    private String apkFileSize;    //已下载文件大小    private String tmpFileSize;    private String curVersionName = "";    private int curVersionCode;    private Update mUpdate;    private  String mUpdateVersion;    private Handler mHandler = new Handler(){        public void handleMessage(Message msg) {            switch (msg.what) {                case DOWN_UPDATE:                    mProgress.setProgress(progress);                    mProgressText.setText(tmpFileSize + "/" + apkFileSize);                    break;                case DOWN_OVER:                    downloadDialog.dismiss();                    installApk();                    break;                case DOWN_NOSDCARD:                    downloadDialog.dismiss();                    //Toast.makeText(mContext, "无法下载安装文件,请检查SD卡是否挂载").show();                    break;            }        };    };    public static UpdateManager getUpdateManager() {        if(updateManager == null){            updateManager = new UpdateManager();        }        updateManager.interceptFlag = false;        return updateManager;    }    /**     * 检查App更新     * @param context     * @param isShowMsg 是否显示提示消息     */    public void checkAppUpdate(Context context, final boolean isShowMsg){        this.mContext = context;        getCurrentVersion();        if(isShowMsg){            if(mProDialog == null)                mProDialog = ProgressDialog.show(mContext, null, "正在检测,请稍后...", true, true);            else if(mProDialog.isShowing() || (latestOrFailDialog!=null && latestOrFailDialog.isShowing()))                return;        }        final Handler handler = new Handler(){            public void handleMessage(Message msg) {                //进度条对话框不显示 - 检测结果也不显示                if(mProDialog != null && !mProDialog.isShowing()){                    return;                }                //关闭并释放释放进度条对话框                if(isShowMsg && mProDialog != null){                    mProDialog.dismiss();                    mProDialog = null;                }                //显示检测结果                if(msg.what == 1){                    mUpdate = (Update)msg.obj;                    if(mUpdate != null ){//更新                        if(!mUpdate.getVersionName().equals(AppConfig.APP_Version) ) {                            apkUrl = mUpdate.getDownloadUrl();                            updateMsg =mUpdate.getUpdateLog();                            showNoticeDialog();                        }                        else if(isShowMsg){                            showLatestOrFailDialog(DIALOG_TYPE_LATEST);                        }                    }                }else if(isShowMsg){                    showLatestOrFailDialog(DIALOG_TYPE_FAIL);                }            }        };        new Thread(new Runnable() {            @Override            public void run() {                Message msg = new Message();                Update  update =new Update();                try {                    // Update update = ApiClient.checkVersion((AppContext)mContext.getApplicationContext());                    Document doc = Jsoup.connect("url").timeout(30000).get();                    Element e = doc.select("p.version").first();                    update.setVersionName(e.ownText());                    e = doc.select("p.desc").first();                    update.setUpdateLog(e.ownText());                    e = doc.select("p.url").first();                    update.setDownloadUrl(e.ownText());                } catch (Exception e) {                    update.setVersionName(AppConfig.APP_Version);                }                msg.what = 1;                msg.obj = update;                handler.sendMessage(msg);            }        }).start();    }    /**     * 显示'已经是最新'或者'无法获取版本信息'对话框     */    private void showLatestOrFailDialog(int dialogType) {        if (latestOrFailDialog != null) {            //关闭并释放之前的对话框            latestOrFailDialog.dismiss();            latestOrFailDialog = null;        }        AlertDialog.Builder builder = new Builder(mContext);        builder.setTitle("系统提示");        if (dialogType == DIALOG_TYPE_LATEST) {            builder.setMessage("您当前已经是最新版本");        } else if (dialogType == DIALOG_TYPE_FAIL) {            builder.setMessage("无法获取版本更新信息");        }        builder.setPositiveButton("确定", null);        latestOrFailDialog = builder.create();        latestOrFailDialog.show();    }    /**     * 获取当前客户端版本信息     */    private void getCurrentVersion(){        try {            PackageInfo info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);            curVersionName = info.versionName;            curVersionCode = info.versionCode;        } catch (NameNotFoundException e) {            e.printStackTrace(System.err);        }    }    /**     * 显示版本更新通知对话框     */    private void showNoticeDialog(){        AlertDialog.Builder builder = new Builder(mContext);        builder.setTitle("软件版本更新");        builder.setMessage(updateMsg);        builder.setPositiveButton("立即更新", new OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();                showDownloadDialog();            }        });        builder.setNegativeButton("以后再说", new OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();            }        });        noticeDialog = builder.create();        noticeDialog.show();    }    /**     * 显示下载对话框     */    private void showDownloadDialog(){        AlertDialog.Builder builder = new Builder(mContext);        builder.setTitle("正在下载新版本");        final LayoutInflater inflater = LayoutInflater.from(mContext);        View v = inflater.inflate(R.layout.update_progress, null);        mProgress = (ProgressBar)v.findViewById(R.id.update_progress);        mProgressText = (TextView) v.findViewById(R.id.update_progress_text);        builder.setView(v);        builder.setNegativeButton("取消", new OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();                interceptFlag = true;            }        });        builder.setOnCancelListener(new OnCancelListener() {            @Override            public void onCancel(DialogInterface dialog) {                dialog.dismiss();                interceptFlag = true;            }        });        downloadDialog = builder.create();        downloadDialog.setCanceledOnTouchOutside(false);        downloadDialog.show();        downloadApk();    }    private Runnable mdownApkRunnable = new Runnable() {        @Override        public void run() {            try {                String apkName = "YourApp_"+mUpdate.getVersionName()+".apk";                String tmpApk = "YourApp_"+mUpdate.getVersionName()+".tmp";                //判断是否挂载了SD卡                String storageState = Environment.getExternalStorageState();                if(storageState.equals(Environment.MEDIA_MOUNTED)){                    savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/YourApp/Update/";                    File file = new File(savePath);                    if(!file.exists()){                        file.mkdirs();                    }                    apkFilePath = savePath + apkName;                    tmpFilePath = savePath + tmpApk;                }                //没有挂载SD卡,无法下载文件                if(apkFilePath == null || apkFilePath == ""){                    mHandler.sendEmptyMessage(DOWN_NOSDCARD);                    return;                }                File ApkFile = new File(apkFilePath);                //是否已下载更新文件                if(ApkFile.exists()){                    downloadDialog.dismiss();                    installApk();                    return;                }                //输出临时下载文件                File tmpFile = new File(tmpFilePath);                FileOutputStream fos = new FileOutputStream(tmpFile);                URL url = new URL(apkUrl);                HttpURLConnection conn = (HttpURLConnection)url.openConnection();                conn.connect();                int length = conn.getContentLength();                InputStream is = conn.getInputStream();                //显示文件大小格式:2个小数点显示                DecimalFormat df = new DecimalFormat("0.00");                //进度条下面显示的总文件大小                apkFileSize = df.format((float) length / 1024 / 1024) + "MB";                int count = 0;                byte buf[] = new byte[1024];                do{                    int numread = is.read(buf);                    count += numread;                    //进度条下面显示的当前下载文件大小                    tmpFileSize = df.format((float) count / 1024 / 1024) + "MB";                    //当前进度值                    progress =(int)(((float)count / length) * 100);                    //更新进度                    mHandler.sendEmptyMessage(DOWN_UPDATE);                    if(numread <= 0){                        //下载完成 - 将临时下载文件转成APK文件                        if(tmpFile.renameTo(ApkFile)){                            //通知安装                            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     */    private void downloadApk(){        downLoadThread = new Thread(mdownApkRunnable);        downLoadThread.start();    }    /**     * 安装apk     */    private void installApk(){        File apkfile = new File(apkFilePath);        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);    }}

更多相关文章

  1. Android(安卓)Window的添加和显示过程
  2. android 对话框Dialog背景透明
  3. EP28-DownloadManager分析(1)
  4. Android中实现照片滑动时左右进出的动画的xml代码
  5. android下载大图片避免OOM的解决方法
  6. Android(安卓)自定义View实现仿微信语音界面
  7. Android弹出DatePickerDialog并获取值的方法
  8. android文件下载进度条实现
  9. Android开发配置篇——Eclipse配置

随机推荐

  1. Android studio 下的svn配置使用
  2. 新手学Android
  3. Android SDK Manager 更新方法
  4. 替换Android自带apk
  5. android电源管理简要
  6. Android日期空间(DatePickerDialog)中的年
  7. Android 4.0 横竖屏切换注意事项
  8. Android Studio 1.0 官网下载链接
  9. Android拍照,上传,预览综合【修改】
  10. Android Maven 采用第三方jar包,程序运行