在splashActivity中判断版本号,从自己公司服务器下载新版本的apk

public class PackageTool {

    /**
     * 获取应用程序的版本号
     */
    public static int getVersionCode(Context context){
        //1.获取包的管理者,获取清单文件的信息
        PackageManager pm = context.getPackageManager();
        try {
            //2.根据包名和标示获取清单文件信息
            //packageName : 应用程序的包名
            //flags : 获取额外信息的标示, GET_ACTIVITIES:标示额外的获取activity的信息,如果不添加标示是获取不到的,如果是0表示获取包名,版本号,版本名称等基本的信息
            //getPackageName() : 获取当前应用程序的报名
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (NameNotFoundException e) {
            //包名找不到的异常
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取应用程序的版本名称
     */
    public static String getVersionName(Context context){
        //1.获取包的管理者,获取清单文件的信息
        PackageManager pm = context.getPackageManager();
        try {
            //2.根据包名和标示获取清单文件信息
            //packageName : 应用程序的包名
            //flags : 获取额外信息的标示, GET_ACTIVITIES:标示额外的获取activity的信息,如果不添加标示是获取不到的,如果是0表示获取包名,版本号,版本名称等基本的信息
            //getPackageName() : 获取当前应用程序的报名
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionName;
        } catch (NameNotFoundException e) {
            //包名找不到的异常
            e.printStackTrace();
        }
        return null;
    }

在Activity中做版本判断,并下载apk ,用的是xUtils框架。

/**
     * 更新版本操作
     */
    private void update() {
        //1.链接服务器,获取服务器数据,判断是否有最新版本
        //1.1.链接服务器,联网操作,子线程,权限,HttpUrlConnection  xutils  httpclient  volly  okhttp
        //参数:链接超时时间
        HttpUtils httpUtils = new HttpUtils(2000);
        //参数1:请求方式
        //参数2:请求路径
        //参数3:请求的参数
        //参数4:RequestCallBack请求回调
        httpUtils.send(HttpMethod.GET, CONNECTURL, null, new RequestCallBack<String>() {
            //请求成功调用的方法
            @Override
            public void onSuccess(ResponseInfo<String> responseInfo) {
                //1.2.获取服务器返回的数据,问题:服务器返回那些数据:code:新版本的版本号     apkurl:新版本的下载地址      msg:新版本的描述信息,描述更新的内容的
                //问题:需要知道服务器如何封装数据   xml  json
                String json = responseInfo.result;//获取服务器返回的数据
                System.out.println(json);
                //1.2.1.解析获取到json数据
                processJSON(json);
            }

            //请求失败调用的方法
            @Override
            public void onFailure(HttpException arg0, String arg1) {
                //请求失败的时候跳转到首页
                enterHome();
            }
        });
    }

    /**
     * 1.2.1.解析获取到json数据
     * @param json
     */
    protected void processJSON(String json) {
        try {
            JSONObject jsonObject = new JSONObject(json);
            mNewsVersion = jsonObject.getInt("code");
            mNewsUrl = jsonObject.getString("apkurl");
            mNewsMsg = jsonObject.getString("msg");

            System.out.println("code:"+mNewsVersion+" apkurl:"+mNewsUrl+" msg:"+mNewsMsg);

            //1.3.判断是否有最新版本
            //判断服务器中新版本的版本号和当前应用程序的版本号是否一致,一致:没有最新版本,不一致:有最新版本
            if (mNewsVersion == PackageTool.getVersionCode(this)) {
                //一致:没有最新版本
                //跳转到首页
                enterHome();
            }else{
                //不一致:有最新版本
                //2.弹出更新版本的对话框
                showUpdateDialog();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    /**
     * 跳转首页的操作
     */
    protected void enterHome() {
        Intent intent = new Intent(this,HomeActivity.class);
        startActivity(intent);
        finish();//移除/结束当前的activity,在跳转成功之后,移除SplashActivity,这样当从HomActivity点击返回键返回的时候,因为不会找到SplashActivity所以会直接退出应用程序
    }

    /**
     * 2.创建提醒用户更新版本的对话框
     */
    private void showUpdateDialog() {
        AlertDialog.Builder builder = new Builder(this);

        //builder.setCancelable(false);//设置对话框是否可以消失,true:可以;false:不可以,屏蔽返回键

        //设置对话框的标题
        builder.setTitle("最新版本:"+mNewsVersion+".0");
        //设置图标
        builder.setIcon(R.drawable.ic_launcher);
        //设置对话框内容
        builder.setMessage(mNewsMsg);

        //监听对话框消失的时候
        builder.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                //跳转到首页的操作
                dialog.dismiss();
                enterHome();
            }
        });

        //创建按钮
        builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                //隐藏对话框,下载最新版本apk
                dialog.dismiss();
                //3.下载最新版本apk
                downloadAPK();
            }
        });
        builder.setNegativeButton("以后再说", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                //隐藏对话框,跳转到首页
                dialog.dismiss();
                enterHome();
            }
        });
        //展示对话框
        builder.show();
        //builder.create().show();//相同的效果
    }

    /**
     * 3.下载最新版的apk
     */
    protected void downloadAPK() {
        //判断SD卡是否挂载
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

            //3.2.在下载的时候,弹出进度条的对话框
            showProgressDialog();

            //3.1.从服务器下载,联网操作
            HttpUtils httpUtils = new HttpUtils();
            //下载操作
            //问题:1.设置下载路径;2.SD卡权限;3.判断SD卡是否挂载成功;4.生成一个2.0版本的apk存放到服务器
            //参数1:下载的路径
            //参数2:保存的路径
            //参数3:下载回调
            httpUtils.download(mNewsUrl, SAVEURL, new RequestCallBack() {

                @Override
                public void onSuccess(ResponseInfo arg0) {
                    //下载成功,隐藏进度条对话框
                    progressDialog.dismiss();
                    //4.安装最新版本apk
                    installAPK();
                }
                @Override
                public void onFailure(HttpException arg0, String arg1) {
                    //下载失败,隐藏进度条,通知跳转到首页
                    progressDialog.dismiss();
                    enterHome();
                }

                //更新下载进度
                //total : 总进度
                //current : 当前的下载进度
                //isUploading : 是否支持回调上传
                @Override
                public void onLoading(long total, long current,
                        boolean isUploading) {
                    super.onLoading(total, current, isUploading);
                    //设置进度条显示总进度和下载进度
                    progressDialog.setMax((int) total);//设置总进度
                    progressDialog.setProgress((int) current);//设置当前下载的进度
                }
            });
        }else{
            Toast.makeText(getApplicationContext(), "没有可用的SD卡", 0).show();
        }

    }

    /**
     * 3.2.显示下载进度的对话框
     */
    private void showProgressDialog() {
        progressDialog = new ProgressDialog(this);
        progressDialog.setCancelable(false);//设置对话框是否可以消失,true:可以;false:不可以,屏蔽返回键
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置进度条对话框中进度的样式
        progressDialog.show();//显示dialog
    }

    /**
     * 4.安装最新版本apk
     */
    protected void installAPK() {
        //通过隐式意图打开系统的安装界面
        /**
         * <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="content" />// content://
                <data android:scheme="file" />
                <data android:mimeType="application/vnd.android.package-archive" />
            </intent-filter>
         */
        Intent intent = new Intent();
        intent.setAction("android.intent.action.VIEW");
        intent.addCategory("android.intent.category.DEFAULT");
        //相互覆盖
        /*intent.setData(Uri.fromFile(new File(SAVEURL)));
        intent.setType("application/vnd.android.package-archive");*/
        intent.setDataAndType(Uri.fromFile(new File(SAVEURL)), "application/vnd.android.package-archive");
        //startActivity(intent);
        //当当前的activity退出的时候,回调之前activity的onactivityReulst方法
        //requestCode : 请求码
        startActivityForResult(intent, 0);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //跳转首页的操作
        enterHome();
    }
时间: 2024-10-06 03:57:45

在splashActivity中判断版本号,从自己公司服务器下载新版本的apk的相关文章

如何用WxJump实现从微信中自动跳转到浏览器并下载APP(apk下载)

做微信营销活动或者APK下载推广时候,域名经常被封,如何做到微信中正常使用呢?这就要借助一些工具来实现有效的操作. 之前公司有一个新的APP项目上线,让我们在项目首页做个二维码,然后用户用手机扫一扫就能下载了.但是微信的扫一扫之后下载不了. 上网查了一下,微信自带的内置浏览器屏蔽了下载功能,所以才出现用微信扫一扫不能下载的情况.这时候我们一般会建议用户使用uc或者其他第三方浏览器自带的扫一扫功能下载.但是现在的微信太普及了,很多人都习惯性的使用微信来扫码下载,总不能每个用户都解释一遍,所以我们一

HTML5中判断横屏竖屏

HTML5中判断横屏竖屏 在移动端中我们经常碰到横屏竖屏的问题,那么我们应该如何去判断或者针对横屏.竖屏来写不同的代码呢. 这里有两种方法: 一:CSS判断横屏竖屏 写在同一个CSS中 1 2 3 4 5 6 @media screen and (orientation: portrait) {   /*竖屏 css*/ } @media screen and (orientation: landscape) {   /*横屏 css*/ } 分开写在2个CSS中 竖屏 1 <link rel=

mysql中判断字段为空

mysql中判断字段为null或者不为null 在mysql中,查询某字段为空时,切记不可用 = null, 而是 is null,不为空则是 is not null select nulcolumn from table; if nuncolumn is null then select 1; else select 2; end if;

VB 6.0中判断是否Access 2010中存在指定表格

问题 最近在工作中遇到使用VB6判断是否ACCESS 2010数据库中是否存在指定表格的问题.对于早期ACCESS数据库(应当主要是ACCESS 2003及以前版本),使用DAO引擎操作是没有问题的.主要相关代码如下: For Each mytable In mydatabase.TableDefs    print mytable.nameNext 但是,DAO技术已经不适用于ACCESS 2010了.为此,我使用BAIDU搜索,初步得到的一个方法如下: cn2.Open "Provider=

在JavaScript中判断整型的N种方法

整数类型(Integer)在JavaScript经常会导致一些奇怪的问题.在ECMAScript的规范中,他们只存在于概念中: 所有的数字都是浮点数,并且整数只是没有一组没有小数的数字. 在这篇博客中,我会解释如何去检查某个值是否为整型. ECMAScript 5 在ES5中有很多方法你可以使用.有时侯,你可能想用自己的方法:一个isInteger(x)的函数,如果是整型返回true,否则返回false. 让我们看看一些例子. 通过余数检查 你可以使用余数运算(%),将一个数字按1求余,看看余数

在Java中判断数组中包含某个元素的几种方式的比较

闲来无事,将java中判断数组中包含某个元素的几种方式的速度进行对比,直接上代码 talk is cheap, show you the code package test.contain.lishaojie; import java.util.Arrays;import java.util.HashSet;import java.util.Set; public class TestContain { /** * @param args */ public static void main(S

字符串--java中判断字符串是否为数字的方法的几种方法?

ava中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ System.out.println(str.charAt(i)); if (!Character.isDigit(str.charAt(i))){ return false; } } return true; } 2.用正则表达式 首先要import java.u

Wix安装程序中判断是否安装的.net framwork 4.5

Wix安装程序中判断是否安装的.net framwork 4.5 <PropertyRef Id="NETFRAMEWORK40FULL"/> <PropertyRef Id="NETFRAMEWORK45"/> <Condition Message='This setup requires Microsoft .NET Framework 4.0 Full package or greater needs to be installe

java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”

在javascript中有一个方法isDigit()使用来判断一个字符串是否都是数字,在java的字符串处理方法中没有这样的方法,觉得常常需要用到,于是上网搜了一下,整理出了两个用正则表达式匹配的判断方法,如下: // 判断一个字符串是否都为数字 public boolean isDigit(String strNum) { return strNum.matches("[0-9]{1,}"); } // 判断一个字符串是否都为数字 public boolean isDigit(Str