首页 > 代码库 > 在splashActivity中判断版本号,从自己公司服务器下载新版本的apk

在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 onl oading(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(); }

 

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