Android 应用更新升级模块实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010872619/article/details/78549236
   最近公司需求需要把公司所有app更新,整合成一个模块,做一个统一的更新界面。先说一下具体实现思路,更新分为普通更新和强制更新,应用首次进入时获取app最新信息,保存对应信息,如果版本大于当前版本,弹出更新提示dialog,如果用户点击更新,或者暂不更新,都保存此时的时间。下次进入app时,先检测上次检测的是否为强制更新,如果是则获取app信息,否则根据现在时间减去之前存的时间点,算出时间差,如果6小时内则不进行请求app信息(根据自己业务需求)。用户点击更新,则启动下载,如果因网络原因下载暂停,下次更新会从上次下载的地方继续下载。
   以下贴出核心使用说明代码,给大家支出一个方向。如需源码:[源码下载](http://download.csdn.net/download/u010872619/10121077)
    /**
     * 检查更新,进入app调用UpdateCenter.getInstance(this).updateApk();
     */
    public void updateApk() {
        if (CommonUtils.isNetworkConnected(mActivity)) {
            isUpdate();
        } else {
            Log.e(TAG, "updateApkCall: ---网络异常");
        }
    }

    /**
     * 用户主动检查更新,调用UpdateCenter.getInstance(this).detectApk();
     */
    public void detectApk() {
        loadApkInfo("isdetect");
    }
    /**
     * 判断是否需要更新
     */
    private void isUpdate() {
        long time = System.currentTimeMillis() - mUpdateSPUtils.getLong(Constant.UPGRADE_TIME_KEY, 0);
        Log.e(TAG, "---System.currentTimeMillis():" + System.currentTimeMillis()
                + "  更新时间:" + mUpdateSPUtils.getLong(Constant.UPGRADE_TIME_KEY, 0) + "  time:" + time);
        //上次检查过存的是否强制更新状态
        boolean isForce = mUpdateSPUtils.getBoolean(Constant.UPGRADE_ISFORCE_KEY, false);
        //如果上次检测是强制更新而没有更新继续检测,否则6小时内不再检测
        if (isForce) {
            Log.e(TAG, "isUpdate: ---强制更新");
            loadApkInfo(null);
        } else {
            if (time > minUpdateTime) {
                loadApkInfo(null);
            } else {
                Log.e(TAG, "isUpdate: ---小于6小时,忽略更新");
            }
        }
    }
    /**
     * 开启线程,获取最新apk信息
     *
     * @param isdetect 是否主动检查更新(任意字符串)
     */
    private void loadApkInfo(String isdetect) {
        Log.e(TAG, "loadApkInfo: ---开始获取最新apk信息");
        AsyncTask.Status status = null;
        if (mAsyncTask != null) {
            status = mAsyncTask.getStatus();
            if (AsyncTask.Status.FINISHED == status) {
                mAsyncTask = null;
            }
        }
        if (mAsyncTask == null) {
            initThread();
        }

        if (status != AsyncTask.Status.RUNNING) {
            mAsyncTask.execute(getUploadUlr(), isdetect);
        }
    }
    /**
     * 初始化更新异步任务,获取最新apk信息,然后解析
     */
    private void initThread() {
        mAsyncTask = new AsyncTask<String, Void, ApkInfo>() {

            private boolean isdetect = false;

            @Override
            protected ApkInfo doInBackground(String... params) {
                String urlString = params[0];
                isdetect = params[1] == null ? false : true;

                if (TextUtils.isEmpty(urlString)) {
                    return null;
                }
                ApkInfo apkInfo = null;

                ByteArrayOutputStream baos        = new ByteArrayOutputStream();
                InputStream           inputStream = null;
                byte[]                result      = null;
                URL                   url         = null;
                HttpURLConnection     connection  = null;
                try {
                    url = new URL(urlString);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setConnectTimeout(5 * 1000);
                    connection.setReadTimeout(5 * 1000);
                    if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        inputStream = connection.getInputStream();
                        byte[] buff   = new byte[2014];
                        int    length = 0;
                        while ((length = inputStream.read(buff)) != -1) {
                            baos.write(buff, 0, length);
                            baos.flush();
                        }
                        result = baos.toByteArray();
                        Log.e(TAG, "initThread---json:" + new String(result));
                        JSONObject json = new JSONObject(new String(result));

                        int rus = json.isNull("rt") ? -1 : json.getInt("rt");
                        if (rus == 1) {
                            apkInfo = new ApkInfo();
                            apkInfo.setIcon(json.isNull(Constant.UPGRADE_ICON_KEY) ? "" : json.getString(Constant.UPGRADE_ICON_KEY));
                            apkInfo.setIsforce(json.isNull(Constant.UPGRADE_ISFORCE_KEY) ? false : json.getBoolean(Constant.UPGRADE_ISFORCE_KEY));
                            apkInfo.setDescription(json.isNull(Constant.UPGRADE_DESCRIPTION_KEY) ? "" : json.getString(Constant.UPGRADE_DESCRIPTION_KEY));
                            apkInfo.setName(json.isNull(Constant.UPGRADE_NAME_KEY) ? null : json.getString(Constant.UPGRADE_NAME_KEY));
                            apkInfo.setMd5(json.isNull(Constant.UPGRADE_MD5_KEY) ? null : json.getString(Constant.UPGRADE_MD5_KEY));
                            apkInfo.setPath(json.isNull(Constant.UPGRADE_PATH_KEY) ? null : json.getString(Constant.UPGRADE_PATH_KEY));
                            apkInfo.setRt(json.isNull(Constant.UPGRADE_RT_KEY) ? -1 : json.getInt(Constant.UPGRADE_RT_KEY));
                            apkInfo.setVersion(json.isNull(Constant.UPGRADE_VERSION_KEY) ? null : json.getString(Constant.UPGRADE_VERSION_KEY));
                            apkInfo.setVcode(json.isNull(Constant.UPGRADE_VCODE_KEY) ? -1 : json.getInt(Constant.UPGRADE_VCODE_KEY));
                            mUpdateSPUtils.put(apkInfo);
                        }
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                //Log.e(TAG, "urlString---:" + urlString);
                return apkInfo;
            }

            /** doInBackground 之后 */
            @Override
            protected void onPostExecute(ApkInfo apkInfo) {
                if (apkInfo != null) {
                    Log.e(TAG, "onPostExecute  服务器获取到的versionCode:" + apkInfo.getVcode() + "    当前软件 versionCode:" + ApkInfoUtil.getAppVersionCode(mActivity, null));
                    if (apkInfo.getVcode() > ApkInfoUtil.getAppVersionCode(mActivity, null)) {
                        showUpdateDialog(apkInfo);
                    } else {
                        if (isdetect) {
                            Toast.makeText(mActivity, CommonUtils.plusString(mActivity.getString(R.string.has_new_version_apk),
                                    apkInfo.getName(), "!"), Toast.LENGTH_LONG).show();
                        }
                    }
                }
            }

            /** doInBackground 之前 */
            @Override
            protected void onPreExecute() {

            }
        };
    }
    /**
     * 显示更新dialog,这里自定义的一个dialog,根据自己公司业务定制
     *
     * @param apkInfo
     */
    private void showUpdateDialog(ApkInfo apkInfo) {
        UpdateDialog dialog = new UpdateDialog(mActivity, apkInfo, this);
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
    }
    /**
     * dialog 点击立即更新按钮回调:使用FileDownloader下载app
     */
    @Override
    public void updateListener(ApkInfo apkInfo) {
        DownloadAppUtils.download(mActivity, apkInfo);
    }

    /**
     * dialog 点击x按钮回调
     */
    @Override
    public void closeListener(ApkInfo apkInfo) {
        if (apkInfo.isforce()) {
            exit();//退出应用
        }
    }

    /**
     * dialog 点击暂不更新按钮回调
     */
    @Override
    public void notUpdateListener(ApkInfo apkInfo) {
        if (apkInfo.isforce()) {
            exit();//退出应用
        } else {
            mUpdateSPUtils.putLong(Constant.UPGRADE_TIME_KEY, System.currentTimeMillis());
        }
    }

猜你喜欢

转载自blog.csdn.net/u010872619/article/details/78549236