自从友盟关闭了版本更新功能后,安卓的版本更新只能本身来撸了,结合以前友盟的版本更新,其实实现起来也简单,这里简单说说版本更新实现的思路:android
第一步,经过接口获取更新信息(版本号、更新内容、apk下载地址、是否强制更新)git
第二步,经过接口拿到的版本号和本地的版本号进行比较,若是拿到的版本号比本地的版本号大,那就进行版本升级github
第三步,版本升级分为三种状况:
非wifi状况下,弹出版本更新提示框,用户点击“当即升级”按钮开始下载apk,下载完成后提示安装。wifi状况下,直接后台下载apk,下载完后弹出版本更新提示框,用户点击“当即安装”按钮开始安装apk。网络
三、强制更新为true的时候,不管是否wifi状况下,都是应该弹出更新提示框,用户点击“当即升级”按钮开始下载升级,提示框不能取消,点击“关闭”按钮直接退出app。app
基本思路就是上面那样,下面来看看最鸡冻人心的环节,如何在本身的app加入版本更新功能。ide
BaseAndroid.checkUpdate(MainActivity.this, 2,
"http://f5.market.mi-img.com/download/AppStore/0f4a347f5ce5a7e01315dda1ec35944fa56431d44/luo.footprint.apk",
"更新了XXXn修复OOO", false);优化
固然啦,前提是你得依赖了个人base库:
https://github.com/LuoGuoXin/...
哈哈,你也能够直接复制版本更新的部分过去就行啦,再根据本身需求修改下,有什么好的建议记得评论,由于那个功能我也还没去优化的。ui
那下面进行代码分析哈:首先是主方法this
/** * 版本更新 * * @param context * @param versionCode 版本号 * @param url apk下载地址 * @param updateMessage 更新内容 * @param isForced 是否强制更新 */ public static void checkUpdate(Context context, int versionCode, String url, String updateMessage, boolean isForced) { if (versionCode > UpdateManager.getInstance().getVersionCode(context)) { int type = 0;//更新方式,0:引导更新,1:安装更新,2:强制更新 if (UpdateManager.getInstance().isWifi(context)) { type = 1; } if (isForced) { type = 2; } //检测是否已下载 String downLoadPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/downloads/"; File dir = new File(downLoadPath); if (!dir.exists()) { dir.mkdir(); } String fileName = url.substring(url.lastIndexOf("/") + 1, url.length()); if (fileName == null && TextUtils.isEmpty(fileName) && !fileName.contains(".apk")) { fileName = context.getPackageName() + ".apk"; } File file = new File(downLoadPath + fileName); //设置参数 UpdateManager.getInstance().setType(type).setUrl(url).setUpdateMessage(updateMessage).setFileName(fileName).setIsDownload(file.exists()); if (type == 1 && !file.exists()) { UpdateManager.getInstance().downloadFile(context); } else { UpdateManager.getInstance().showDialog(context); } } }
而后就是UpdateManager的封装啦,本身看代码吧,有什么优化点评论下,我去修改哈。url
/** * 版本更新 */ public class UpdateManager { private String downLoadPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/downloads/"; private int type = 0;//更新方式,0:引导更新,1:安装更新,2:强制更新 private String url = "";//apk下载地址 private String updateMessage = "";//更新内容 private String fileName = null;//文件名 private boolean isDownload = false;//是否下载 private NotificationManager mNotifyManager; private NotificationCompat.Builder mBuilder; private BaseDialog dialog; private ProgressDialog progressDialog; public static UpdateManager updateManager; public static UpdateManager getInstance() { if (updateManager == null) { updateManager = new UpdateManager(); } return updateManager; } private UpdateManager() { } /** * 弹出版本更新提示框 */ public void showDialog(final Context context) { String title = ""; String left = ""; boolean cancelable = true; if (type == 1 | isDownload) { title = "安装新版本"; left = "当即安装"; } else { title = "发现新版本"; left = "当即更新"; } if (type == 2) { cancelable = false; } dialog = new BaseDialog.Builder(context).setTitle(title).setMessage(updateMessage).setCancelable(cancelable) .setLeftClick(left, new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); if (type == 1 | isDownload) { installApk(context, new File(downLoadPath, fileName)); } else { if (url != null && !TextUtils.isEmpty(url)) { if (type == 2) { createProgress(context); } else { createNotification(context); } downloadFile(context); } else { Toast.makeText(context, "下载地址错误", Toast.LENGTH_SHORT).show(); } } } }) .setRightClick("取消", new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); if (type == 2) { System.exit(0); } } }) .create(); dialog.show(); } /** * 下载apk * */ public void downloadFile(final Context context) { RequestParams params = new RequestParams(url); params.setSaveFilePath(downLoadPath + fileName); x.http().request(HttpMethod.GET, params, new Callback.ProgressCallback<File>() { @Override public void onSuccess(File result) { } @Override public void onError(Throwable ex, boolean isOnCallback) { Toast.makeText(context, ex.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } @Override public void onWaiting() { } @Override public void onStarted() { } @Override public void onLoading(long total, long current, boolean isDownloading) { //实时更新通知栏进度条 if (type == 0) { notifyNotification(current, total); } else if (type == 2) { progressDialog.setProgress((int) (current * 100 / total)); } if (total == current) { if (type == 0) { mBuilder.setContentText("下载完成"); mNotifyManager.notify(10086, mBuilder.build()); } else if (type == 2) { progressDialog.setMessage("下载完成"); } if (type == 1) { showDialog(context); } else { installApk(context, new File(downLoadPath, fileName)); } } } }); } /** * 强制更新时显示在屏幕的进度条 * */ private void createProgress(Context context) { progressDialog = new ProgressDialog(context); progressDialog.setMax(100); progressDialog.setCancelable(false); progressDialog.setMessage("正在下载..."); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.show(); } /** * 建立通知栏进度条 * */ private void createNotification(Context context) { mNotifyManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); mBuilder = new NotificationCompat.Builder(context); mBuilder.setSmallIcon(BaseAndroid.getBaseConfig().getAppLogo()); mBuilder.setContentTitle("版本更新"); mBuilder.setContentText("正在下载..."); mBuilder.setProgress(0, 0, false); Notification notification = mBuilder.build(); notification.flags = Notification.FLAG_AUTO_CANCEL; mNotifyManager.notify(10086, notification); } /** * 更新通知栏进度条 * */ private void notifyNotification(long percent, long length) { mBuilder.setProgress((int) length, (int) percent, false); mNotifyManager.notify(10086, mBuilder.build()); } /** * 安装apk * * @param context 上下文 * @param file APK文件 */ private void installApk(Context context, File file) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); context.startActivity(intent); } /** * @return 当前应用的版本号 */ public int getVersionCode(Context context) { try { PackageManager manager = context.getPackageManager(); PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); int version = info.versionCode; return version; } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 判断当前网络是否wifi */ public boolean isWifi(Context mContext) { ConnectivityManager connectivityManager = (ConnectivityManager) mContext .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { return true; } return false; } public UpdateManager setUrl(String url) { this.url = url; return this; } public UpdateManager setType(int type) { this.type = type; return this; } public UpdateManager setUpdateMessage(String updateMessage) { this.updateMessage = updateMessage; return this; } public UpdateManager setFileName(String fileName) { this.fileName = fileName; return this; } public UpdateManager setIsDownload(boolean download) { isDownload = download; return this; } }