Android版本更新升级
目前,应用市场上的应用程序基本上都有自动更新的功能,用于版本迭代,软件更新以达到更好的应用体验效果。本文我将简要介绍一下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版本更新升级相关推荐
- android最新框架,XUpdate 一个轻量级、高可用性的Android版本更新框架
XUpdate 一个轻量级.高可用性的Android版本更新框架.赶紧点击使用说明文档,体验一下吧! 特点 支持post和get两种版本检查方式,支持自定义网络请求. 支持设置只在wifi下进行版本更 ...
- android studio 无法输入中文,Android Studio 升级到3.0后输入法中文状态下无法选词的终极解决方案...
AndroidStudio终于出3.0正式版了,内置了kotlin(虽然我安了插件一直能用).一直忍着没敢下rc版的好奇猫,总算装了正式版.当然,伴随每次大版本更新,总有一些恼人的后遗症,其中以gra ...
- android开发关掉发现更新的官方版本,XUpdate:轻量级、高可用性的 Android 版本更新框架...
一个轻量级.高可用性的Android版本更新框架 关于我 特点 支持post和get两种版本检查方式,支持自定义网络请求. 支持设置只在wifi下进行版本更新. 支持静默下载.自动版本更新. 提供界面 ...
- Android版本更新
Android版本更新知识(检测.升级)总结 2017年03月14日 16:19:39 阅读数:13941 Android版本更新知识(检测.升级)总结 本文对Android版本更新的知识做全面的总结 ...
- Android 版本更新,支持增量更新
AppSmartUpdate 项目地址:itlwy/AppSmartUpdate 简介: a smart lib for updating app / Android 版本更新,支持增量更新 更多:作 ...
- 无懈可击 Android 内部升级
code小生,一个专注 Android 领域的技术平台 公众号回复 Android 加入我的安卓技术群 作者:码农一颗颗 链接:https://www.jianshu.com/p/ebc5b4a3d2 ...
- 解决android Stadio 升级之后 出现乱码
android stadio 升级到3.6之后,编译项目的时候,输出的都是乱码.如下图: 解决办法: 在help 里面选择 Edit custom- 如下图: 在打开的文件里面添加上以下配置,重启st ...
- 【转】Android OTA 升级之一:编译升级包
Android OTA 升级之一:编译升级包 作者: 宋立新 Email : zjujoe@yahoo.com 前言 OTA 升级是 Android 系统提供的标准软件升级方式. 它功能强大,提供了完 ...
- Android OTA 升级之三:生成recovery.img
Android OTA 升级之三:生成recovery.img 作者: 宋立新 Email:zjujoe@yahoo.com 前言 得到了ota升级包后,我们就可以用它来升级系统了.Android 手 ...
最新文章
- Gin 框架学习笔记(02)— 参数自动绑定到结构体
- vue component动态组件_vue-component组件
- vuescroll使用文档
- mongoose --- 建立一个集合规则,并导出.
- 译文 | 与TensorFlow的第一次接触 第三章:聚类
- 中国脚手架管市场趋势报告、技术动态创新及市场预测
- 深度学习及TensorFlow简介
- Windows环境下安装Hadoop+Hive的使用案例
- Redis实现分布式session功能的共享
- ET7.0 腾讯云centos部署
- 26 | Superscalar和VLIW:如何让CPU的吞吐率超过1
- 至强CPU型号系列的变化
- 数据库Mysql:存储过程(PROCEDURE )函数(FUNCTION)
- perfmon android 7.1,Perfmon - 脚本自动监控
- cmd显示服务器对区域没有权威,查询dns解析服务器地址cmd命令
- 动态监控zookeeper服务节点变动(附zkUI使用)
- java 创建二维码
- matlab取色工具getpts
- Google Earth Engine(GEE)对比显示不同城市的地表温度
- JavaScript(三)js插件