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