Android开发之版本检查更新

作者: Anwfly | 来源:发表于2019-03-08 08:58 被阅读6次

1、版本控制属性

versionCode:

版本号(versionCode)是一个Integer类型的值,所以不要将versionCode设置的太大,最好不要超过Integer的取值范围(当然一般也是不会超过的),一般大家在发布自己的第一个应用到市场的时候,版本取值为1(versionCode=1),这也是目前典型和普遍的做法。然后,每次发布更新版本时可以递增versionCode的值。

vertionName

版本名(versionName)一个值为String类型的属性,一般和VersionCode成对出现。VersionCode是方便程序开发者运行和维护Application而设置的一个有效的值。versionName是一个版本的描述,给用户看的,也是用户放在各个第3方平台上提供给使用者看的一个版本名,可以说是对VersionCode的解释和描述。一般格式可以为:1.1.2。(major.minor.point)的形式。

区别

版本号(versionCode):是用于判断是否升级的,一般每次版本更新,版本号加一。如果获取服务器上的版本号比检测到本程序的版本号高,那么提示升级。

版本名(versionName):用于显示版本改变的幅度大小,比如从2.0.1改变为2.0.2可能只是修改了一个很小的bug,如果改变为2.1.0可能是新增了一些功能,如果改变为3.0.0可能是有很大幅度的修改,比如很多UI界面或功能的添加!
也就是版本号用于判断是否可以升级,而版本名用于显示給用户看!

版本控制的文件位置

Eclipse中在Manifest.xml中的VersionCode为准,而Android studio也可以在Manifest.xml中也有,但是无效的,以app级别的grade中versionCode为准。

2、版本控制步骤
①从自己的服务器获取自己的APP的版本号
②检查是否更新

//对比本程序的版本号和最新程序的版本号
    public void checkVersion() {
        //如果检测本程序的版本号小于服务器的版本号,那么提示用户更新
        if (VersionControlUtils.getVersionCode() < serviceVersionCode) {
            //弹出提示版本更新的对话框
            showDialogUpdate();
        } else {
            //否则吐司,说现在是最新的版本
            Toast.makeText(context, "最新版本"), Toast.LENGTH_SHORT).show();

        }
    }

③弹出更新提示的对话框

private void showDialogUpdate() {
        View inflate = View.inflate(this, R.layout.dialog_clear_butter, null);
        TextView tv_cancel_clear_buffer = (TextView) inflate.findViewById(R.id.tv_cancel_clear_buffer);
        TextView tv_ok_clear_butter = (TextView) inflate.findViewById(R.id.tv_ok_clear_butter);
        TextView tv_dialog_title = (TextView) inflate.findViewById(R.id.tv_dialog_title);
        TextView tv_dialog_message = (TextView) inflate.findViewById(R.id.tv_dialog_message);

        tv_dialog_title.setText("版本升级");
        tv_dialog_message.setText("请更新到最新版本");

        tv_cancel_clear_buffer.setOnClickListener(this);
        tv_ok_clear_butter.setOnClickListener(this);
        // 这里的属性可以一直设置,因为每次设置后返回的是一个builder对象
        dialog = new Dialog(this, R.style.style_dialog);
        dialog.setContentView(inflate);
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
    }

④点击升级版本并下载新版本

private void loadNewVersionProgress() {
        final String uri = "http://www.apk.anzhi.com/data3/apk/201703/14/4636d7fce23c9460587d602b9dc20714_88002100.apk";
        final ProgressDialog pd;    //进度条对话框
        pd = new ProgressDialog(this);
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMessage(getString(R.string.downloading_new_version));
        pd.show();
        //启动子线程下载任务
        new Thread() {
            @Override
            public void run() {
                try {
                    File file = getFileFromServer(uri, pd);
                    sleep(3000);
                    installApk(file);
                    pd.dismiss(); //结束掉进度条对话框
                } catch (Exception e) {
                    //下载apk失败
                    Toast.makeText(getApplicationContext(), R.string.download_new_version_fail, Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                }
            }
        }.start();
    }

⑤根据Uri网址获取apk文件

private File getFileFromServer(String uri, ProgressDialog pd) throws Exception {
        //如果相等的话表示当前的sdcard挂载在手机上并且是可用的
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            URL url = new URL(uri);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            //获取到文件的大小
            pd.setMax(conn.getContentLength());
            InputStream is = conn.getInputStream();
            long time = System.currentTimeMillis();//当前时间的毫秒数
            File file = new File(Environment.getExternalStorageDirectory(), time + "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;
        }
    }

⑥安装apk文件

private void installApk(File file) {
        Intent intent = new Intent();
        //执行动作
        intent.setAction(Intent.ACTION_VIEW);
        //执行的数据类型
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        startActivity(intent);
    }

相关文章

  • Android开发之版本检查更新

    1、版本控制属性 versionCode: 版本号(versionCode)是一个Integer类型的值,所以不要...

  • Android自动更新的实现

    Android自动更新的实现 需求: 在我们开发App的过程中,总会遇到这样的需求。在App运行时检查是否有新版本...

  • 版本更新基础总结

    本文对Android版本更新的知识做全面的总结,主要包括开发中版本的设置,如何检测本程序的版本,版本的更新判断和显...

  • Android APP 版本检查

    情景 01:Android APP 进行版本检查,存在更新或已经是最新,2 种情况情景 02:检查 APP 是否有...

  • 检查版本更新

    问题:最近因为后端接口调整,没有适配老版本,导致线上bug不断.因为我们之前版本更新用的三方框架,会提醒用户到Ap...

  • Android之版本更新

    android中的版本更新是每一个APP的标配,记得最早的时候还是使用HttpUrlConnection+Hand...

  • Android一些常用权限

    Android权限 随着Android手机版本的不断更新,Android手机的的开发需要的东西越来越多,对于手机更...

  • android版本更新策略

    开发中对版本进行检查并更新的需求基本是所有应用必须有的功能,可是在实际开发中有些朋友就容易忽略一些细节。 版本更新...

  • iOS版本更新

    版本更新 #pragma mark -检查版本更新 - (void)checkNewVersion { // NS...

  • XUpdate 一个轻量级、高可用性的Android版本更新框架

    XUpdate 项目地址 一个轻量级、高可用性的Android版本更新框架 特点 支持post和get两种版本检查...

网友评论

    本文标题:Android开发之版本检查更新

    本文链接:https://www.haomeiwen.com/subject/lwjlpqtx.html