目前,应用市场上的应用程序基本上都有自动更新的功能,用于版本迭代,软件更新以达到更好的应用体验效果。本文我将简要介绍一下Android版本更新的相关知识。

一、知识预热

1.versionCode:版本号,Int类型,版本升级主要是根据versionCode的大小比较进行更新操作,如服务器的版本大于当前APP版本,即可进行更新操作,反之不能。
2.versonName:版本名称,String类型,主要是用于用户界面交互。

3.versionCode和versionName的配置在项目下的build.gradle中,可根据项目需要进行相应的配置,如下所示:

defaultConfig {applicationId "example.com.demo_update"minSdkVersion 22targetSdkVersion 25versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

4.代码获取versionCode和versionName。

PackageManager manager = MainActivity.this.getPackageManager();
PackageInfo info = manager.getPackageInfo(MainActivity.this.getPackageName(), 0);
String appVersion = info.versionName; // 版本名
int currentVersionCode = info.versionCode; // 版本号

二、磨刀开工
1.编写检测更新弹框。该步骤主要是通过点击进行事件更新获取操作,进行弹框提示。

/*** 点击下载弹框*/
private void showUpdateDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(R.string.checked_new_version);builder.setMessage(R.string.check_is_update);builder.setPositiveButton("下载", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {startActivity(new Intent(MainActivity.this, NotificationUpdateActivity.class));mDownLoadApp.setDownload(true);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});builder.show();
}

2.更新代码实现。首先应用组件需调用bindService()绑定Service,然后系统自动调用onBind()方法,返回一个用于交互的Ibinder.

绑定是异步的,要接收Ibinder需要创建一个ServiceConnection实例传给bindService(),因为bindService()是不会将IBInder返回给客户端的。系统需要调用该方法传递返回。

ServiceConnection方法如下:

ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubisBinded = false;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubbinder = (DownloadService.DownloadBinder) service;System.out.println("服务启动!!!");// 开始下载isBinded = true;binder.addCallback(callback);binder.start();}
};

更新进度方法实现:

private ICallbackResult callback = new ICallbackResult() {@Overridepublic void OnBackResult(Object result) {// TODO Auto-generated method stubif ("finish".equals(result)) {finish();return;}int i = (Integer) result;mProgressBar.setProgress(i);mHandler.sendEmptyMessage(i);}};private Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {mProgressText.setText("当前进度 : " + msg.what + "%");};
};public interface ICallbackResult {public void OnBackResult(Object result);
}

注:因为更新操作在子线程中操作,但是我们需要在UI线程中显示当前进度,所以需要进行消息传递机制进行UI更新操作。

3.下载更新Service方法实现。Service操作主要是根据当前的操作进度进行Service服务,本段代码中主要是考虑了三个方面的操作:

(1)下载完毕,取消通知,进行安装。

mDownLoadApp.setDownload(false);
// 下载完毕
// 取消通知
mNotificationManager.cancel(NOTIFY_ID);
installApk();

(2)更新中的操作。

int rate = msg.arg1;mDownLoadApp.setDownload(true);if (rate <= 100) {RemoteViews contentview = mNotification.contentView;contentview.setTextViewText(R.id.id_activity_download_progress_tv, rate + "%");contentview.setProgressBar(R.id.id_activity_download_progressbar, 100, rate, false);} else {System.out.println("下载完毕!!!!!!!!!!!");// 下载完毕后变换通知形式mNotification.flags = Notification.FLAG_AUTO_CANCEL;mNotification.contentView = null;Intent intent = new Intent(mContext, NotificationUpdateActivity.class);// 告知已完成intent.putExtra("completed", "yes");// 更新参数,注意flags要使用FLAG_UPDATE_CURRENTPendingIntent contentIntent = PendingIntent.getActivity(mContext, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
//                mNotification.setLatestEventInfo(mContext, "下载完成", "文件已下载完毕", contentIntent);//serviceIsDestroy = true;stopSelf();// 停掉服务自身}mNotificationManager.notify(NOTIFY_ID, mNotification);

(3)手动取消操作,通知取消。

mDownLoadApp.setDownload(false);
// 这里是用户界面手动取消,所以会经过activity的onDestroy();方法
// 取消通知
mNotificationManager.cancel(NOTIFY_ID);

(4)下载apk。

/*** 下载apk* @param url*/
private Thread downLoadThread;private void downloadApk() {downLoadThread = new Thread(mdownApkRunnable);downLoadThread.start();
}private int lastRate = 0;
private Runnable mdownApkRunnable = new Runnable() {@Overridepublic void run() {try {URL url = new URL(mDownLoadUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.connect();int length = conn.getContentLength();InputStream is = conn.getInputStream();File file = new File(savePath);if (!file.exists()) {file.mkdirs();}String apkFile = saveFileName;File ApkFile = new File(apkFile);FileOutputStream fos = new FileOutputStream(ApkFile);int count = 0;byte buf[] = new byte[1024];do {int numread = is.read(buf);count += numread;progress = (int) (((float) count / length) * 100);// 更新进度Message msg = mHandler.obtainMessage();msg.what = 1;msg.arg1 = progress;if (progress >= lastRate + 1) {mHandler.sendMessage(msg);lastRate = progress;if (callback != null)callback.OnBackResult(progress);}if (numread <= 0) {// 下载完成通知安装mHandler.sendEmptyMessage(0);// 下载完了,cancelled也要设置canceled = true;break;}fos.write(buf, 0, numread);} while (!canceled);// 点击取消就停止下载.fos.close();is.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
};

(5)安装apk。

/*** 安装apk* @param*/
private void installApk() {File apkfile = new File(saveFileName);if (!apkfile.exists()) {return;}Intent i = new Intent(Intent.ACTION_VIEW);i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");mContext.startActivity(i);callback.OnBackResult("finish");}

4.Application代码,用于全局检测更新操作。

public class DownLoadApplication extends Application {private boolean isDownload;public boolean isDownload() {return isDownload;}public void setDownload(boolean isDownload) {this.isDownload = isDownload;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();isDownload = false;}
}

三、效果展示

        

四、源码下载

地址:http://download.csdn.net/detail/u012721519/9743234

Good Luck!

Write by Jimmy.li

Android版本更新升级相关推荐

  1. android最新框架,XUpdate 一个轻量级、高可用性的Android版本更新框架

    XUpdate 一个轻量级.高可用性的Android版本更新框架.赶紧点击使用说明文档,体验一下吧! 特点 支持post和get两种版本检查方式,支持自定义网络请求. 支持设置只在wifi下进行版本更 ...

  2. android studio 无法输入中文,Android Studio 升级到3.0后输入法中文状态下无法选词的终极解决方案...

    AndroidStudio终于出3.0正式版了,内置了kotlin(虽然我安了插件一直能用).一直忍着没敢下rc版的好奇猫,总算装了正式版.当然,伴随每次大版本更新,总有一些恼人的后遗症,其中以gra ...

  3. android开发关掉发现更新的官方版本,XUpdate:轻量级、高可用性的 Android 版本更新框架...

    一个轻量级.高可用性的Android版本更新框架 关于我 特点 支持post和get两种版本检查方式,支持自定义网络请求. 支持设置只在wifi下进行版本更新. 支持静默下载.自动版本更新. 提供界面 ...

  4. Android版本更新

    Android版本更新知识(检测.升级)总结 2017年03月14日 16:19:39 阅读数:13941 Android版本更新知识(检测.升级)总结 本文对Android版本更新的知识做全面的总结 ...

  5. Android 版本更新,支持增量更新

    AppSmartUpdate 项目地址:itlwy/AppSmartUpdate 简介: a smart lib for updating app / Android 版本更新,支持增量更新 更多:作 ...

  6. 无懈可击 Android 内部升级

    code小生,一个专注 Android 领域的技术平台 公众号回复 Android 加入我的安卓技术群 作者:码农一颗颗 链接:https://www.jianshu.com/p/ebc5b4a3d2 ...

  7. 解决android Stadio 升级之后 出现乱码

    android stadio 升级到3.6之后,编译项目的时候,输出的都是乱码.如下图: 解决办法: 在help 里面选择 Edit custom- 如下图: 在打开的文件里面添加上以下配置,重启st ...

  8. 【转】Android OTA 升级之一:编译升级包

    Android OTA 升级之一:编译升级包 作者: 宋立新 Email : zjujoe@yahoo.com 前言 OTA 升级是 Android 系统提供的标准软件升级方式. 它功能强大,提供了完 ...

  9. Android OTA 升级之三:生成recovery.img

    Android OTA 升级之三:生成recovery.img 作者: 宋立新 Email:zjujoe@yahoo.com 前言 得到了ota升级包后,我们就可以用它来升级系统了.Android 手 ...

最新文章

  1. Gin 框架学习笔记(02)— 参数自动绑定到结构体
  2. vue component动态组件_vue-component组件
  3. vuescroll使用文档
  4. mongoose --- 建立一个集合规则,并导出.
  5. 译文 | 与TensorFlow的第一次接触 第三章:聚类
  6. 中国脚手架管市场趋势报告、技术动态创新及市场预测
  7. 深度学习及TensorFlow简介
  8. Windows环境下安装Hadoop+Hive的使用案例
  9. Redis实现分布式session功能的共享
  10. ET7.0 腾讯云centos部署
  11. 26 | Superscalar和VLIW:如何让CPU的吞吐率超过1
  12. 至强CPU型号系列的变化
  13. 数据库Mysql:存储过程(PROCEDURE )函数(FUNCTION)
  14. perfmon android 7.1,Perfmon - 脚本自动监控
  15. cmd显示服务器对区域没有权威,查询dns解析服务器地址cmd命令
  16. 动态监控zookeeper服务节点变动(附zkUI使用)
  17. java 创建二维码
  18. matlab取色工具getpts
  19. Google Earth Engine(GEE)对比显示不同城市的地表温度
  20. JavaScript(三)js插件

热门文章

  1. git clone 、pull、stash的故事
  2. 任何一句话都可以品味一辈子
  3. 吴刚:无线游戏的破局绝对在于专注
  4. 推荐系统实践 - 第2章
  5. linux普通用户获取root权限_小米CC9和小米CC9e TWRP3.2-3.3已发布-最简单刷机-获取ROOT权限...
  6. 中国民生银行:智能运维引领数据中心数字化转型
  7. 清除maven仓库的脚本(解决jar包冲突,jar包不全)
  8. OTA升级-1-通过链表对单片机FLASH进行读写操作
  9. PHP 多线程的使用
  10. recognize和recognition