Android自己主动检測版本号及自己主动升级
步骤:
1.检測当前版本号的信息AndroidManifest.xml-->manifest-->android:versionName。
2.从server获取版本号号(版本号号存在于xml文件里)并与当前检測到的版本号进行匹配,假设不匹配,提示用户进行升级。假设匹配则进入程序主界面。
3.当提示用户进行版本号升级时。假设用户点击了确定,系统将自己主动从server上下载并进行自己主动升级,假设点击取消将进入程序主界面。
效果图:


获取当前程序的版本:
- /*
- * 获取当前程序的版本
- */
- private String getVersionName() throws Exception{
- //获取packagemanager的实例
- PackageManager packageManager = getPackageManager();
- //getPackageName()是你当前类的包名,0代表是获取版本号信息
- PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);
- return packInfo.versionName;
- }
获取server端的版本:
- /*
- * 用pull解析器解析server返回的xml文件 (xml封装了版本)
- */
- public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(is, "utf-8");//设置解析的数据源
- int type = parser.getEventType();
- UpdataInfo info = new UpdataInfo();//实体
- while(type != XmlPullParser.END_DOCUMENT ){
- switch (type) {
- case XmlPullParser.START_TAG:
- if("version".equals(parser.getName())){
- info.setVersion(parser.nextText()); //获取版本
- }else if ("url".equals(parser.getName())){
- info.setUrl(parser.nextText()); //获取要升级的APK文件
- }else if ("description".equals(parser.getName())){
- info.setDescription(parser.nextText()); //获取该文件的信息
- }
- break;
- }
- type = parser.next();
- }
- return info;
- }
从server下载apk:
- public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{
- //假设相等的话表示当前的sdcard挂载在手机上而且是可用的
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- //获取到文件的大小
- pd.setMax(conn.getContentLength());
- InputStream is = conn.getInputStream();
- File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");
- FileOutputStream fos = new FileOutputStream(file);
- BufferedInputStream bis = new BufferedInputStream(is);
- byte[] buffer = new byte[1024];
- int len ;
- int total=0;
- while((len =bis.read(buffer))!=-1){
- fos.write(buffer, 0, len);
- total+= len;
- //获取当前下载量
- pd.setProgress(total);
- }
- fos.close();
- bis.close();
- is.close();
- return file;
- }
- else{
- return null;
- }
- }
匹配、下载、自己主动安装:
- /*
- * 从server获取xml解析并进行比对版本
- */
- public class CheckVersionTask implements Runnable{
- public void run() {
- try {
- //从资源文件获取server 地址
- String path = getResources().getString(R.string.serverurl);
- //包装成url的对象
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- InputStream is =conn.getInputStream();
- info = UpdataInfoParser.getUpdataInfo(is);
- if(info.getVersion().equals(versionname)){
- Log.i(TAG,"版本同样无需升级");
- LoginMain();
- }else{
- Log.i(TAG,"版本不同 ,提示用户升级 ");
- Message msg = new Message();
- msg.what = UPDATA_CLIENT;
- handler.sendMessage(msg);
- }
- } catch (Exception e) {
- // 待处理
- Message msg = new Message();
- msg.what = GET_UNDATAINFO_ERROR;
- handler.sendMessage(msg);
- e.printStackTrace();
- }
- }
- }
- Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- switch (msg.what) {
- case UPDATA_CLIENT:
- //对话框通知用户升级程序
- showUpdataDialog();
- break;
- case GET_UNDATAINFO_ERROR:
- //server超时
- Toast.makeText(getApplicationContext(), "获取server更新信息失败", 1).show();
- LoginMain();
- break;
- case DOWN_ERROR:
- //下载apk失败
- Toast.makeText(getApplicationContext(), "下载新版本号失败", 1).show();
- LoginMain();
- break;
- }
- }
- };
- /*
- *
- * 弹出对话框通知用户更新程序
- *
- * 弹出对话框的步骤:
- * 1.创建alertDialog的builder.
- * 2.要给builder设置属性, 对话框的内容,样式,button
- * 3.通过builder 创建一个对话框
- * 4.对话框show()出来
- */
- protected void showUpdataDialog() {
- AlertDialog.Builder builer = new Builder(this) ;
- builer.setTitle("版本号升级");
- builer.setMessage(info.getDescription());
- //当点确定button时从server上下载 新的apk 然后安装
- builer.setPositiveButton("确定", new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG,"下载apk,更新");
- downLoadApk();
- }
- });
- //当点取消button时进行登录
- builer.setNegativeButton("取消", new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- LoginMain();
- }
- });
- AlertDialog dialog = builer.create();
- dialog.show();
- }
- /*
- * 从server中下载APK
- */
- protected void downLoadApk() {
- final ProgressDialog pd; //进度条对话框
- pd = new ProgressDialog(this);
- pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- pd.setMessage("正在下载更新");
- pd.show();
- new Thread(){
- @Override
- public void run() {
- try {
- File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);
- sleep(3000);
- installApk(file);
- pd.dismiss(); //结束掉进度条对话框
- } catch (Exception e) {
- Message msg = new Message();
- msg.what = DOWN_ERROR;
- handler.sendMessage(msg);
- e.printStackTrace();
- }
- }}.start();
- }
- //安装apk
- protected void installApk(File file) {
- Intent intent = new Intent();
- //运行动作
- intent.setAction(Intent.ACTION_VIEW);
- //运行的数据类型
- intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
- startActivity(intent);
- }
- /*
- * 进入程序的主界面
- */
- private void LoginMain(){
- Intent intent = new Intent(this,MainActivity.class);
- startActivity(intent);
- //结束掉当前的activity
- this.finish();
- }
UpdataInfo:
- public class UpdataInfo {
- private String version;
- private String url;
- private String description;
- public String getVersion() {
- return version;
- }
- public void setVersion(String version) {
- this.version = version;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- }
update.xml:
- <?
xml version="1.0" encoding="utf-8"?>
- <info>
- <version>2.0</version>
- <url>http://192.168.1.187:8080/mobilesafe.apk</url>
- <description>检測到最新版本号,请及时更新!</description>
- </info>
Android自己主动检測版本号及自己主动升级的更多相关文章
- Android Studio代码自己主动检測错误提示
Android Studio的代码自己主动检測的错误提示方式感觉有点奇葩.和Eclipse区别非常大,Eclipse检測到某个资源文件找不到或者错误,都会在Project中相应的文件前面打叉.可是An ...
- 使用UIDataDetectorTypes自己主动检測电话、网址和邮箱
支付宝公布最新版本号9.0.再一次引发一场撕逼大战.微信说支付宝抄袭了它.支付宝说微信一直都在抄袭自己.在我看来.微信和支付宝都抄袭了对方.对于大佬们的抄袭.我们也是司空见惯了. 支付宝这一次更新,真 ...
- 自己主动检測&后台复制光盘内容
原理:利用python的win32模块,注冊服务,让代码在后台执行,检測光盘并复制文件 启动的方法就是直接在cmd下,main.py install ,然后去windows 的服务下就能够看到The ...
- 从头认识Spring-2.7 自己主动检測Bean(1)-@Component @Repository @Service @Controller
这一章节我们来讨论一下自己主动检測Bean. 1.domain 厨师类: package com.raylee.my_new_spring.my_new_spring.ch02.topic_1_19; ...
- 从头认识Spring-2.7 自己主动检測Bean(2)-过滤器<context:include-filter/>
这一章节我们来讨论一下过滤器<context:include-filter/>的使用. 1.domain Person接口: package com.raylee.my_new_sprin ...
- Android Studio2.0 Beta 2版本号更新说明及注意事项
我们刚刚向canary channel推送了Android Studio2.0 Beta 2版本号 老毕译注: ---------- canary channel: 金丝雀版本号,平均1到2周就会更新 ...
- Android下的单元測试
android下的单元測试 在AndroidManifest.xml文件里配置下面信息: 在manifest节点下加入: <!-- 指定測试信息和要測试的包 --> <instrum ...
- Mac下改动Android Studio 所用的JDK版本号
Mac下改动Android Studio 所用的JDK版本号 @author ASCE1885 近期项目从Eclipse+Ant构建模式转移到了Android Studio+Gradle构建模式.自然 ...
- Android各版本代号、版本号、API/NDK级别、发布时间及市场份额
Android各版本代号.版本号.API/NDK级别.发布时间及市场份额 代号 版本号 API/NDK级别 发布时间 - O 8.0 API level 26 2017-3-21 牛轧糖 Nougat ...
随机推荐
- 团队作业-Beta冲刺(1)
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 这个作业要求在哪里 https://edu.cnblo ...
- JSP中使用EL表达式
EL表达式 :EL 全名为Expression Language,就是为了替代<%= %>脚本表达式. EL主要作用: 获取数据: EL表达式主要用于替换JSP页面中的脚本表达式,以从各种 ...
- java 三次样条插值 画光滑曲线 例子
java 三次样条插值 画光滑曲线 例子 主要是做数值拟合,根据sin函数采点,取得数据后在java中插值并在swing中画出曲线,下面为截图 不光滑和光滑曲线前后对比: 代码: 执行类: p ...
- 微信小程序弹框提示绑定手环实例
今天想聊一聊小程序里面存在的一些逻辑问题,拿手上的这个小程序来说,(这个小程序是开发出来玩的,每个人手上有一个手环,带着手环时候的心率,运动步数,血压数据都会展现在这个小程序里面,一目了然)用户第一次 ...
- C#如何调用非托管的C++Dll
现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...
- Activity学习
http://www.360doc.com/content/13/1106/11/203871_327110236.shtml http://www.jianshu.com/p/e6971e8a8da ...
- 题目1205:N阶楼梯上楼问题(2008年华中科技大学计算机保研机试真题:递推求解)
题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2447 解决:927 题目描写叙述: N阶楼梯上楼问题:一次能够走两阶或一阶,问有多少种上楼方式. (要求 ...
- (转)xshell无法在vim中复制黏贴
ssh xshell 连接在vim中无法用 ctrl+insert 复制黏贴 修改.vimrc set mouse=c vi的三种模式:命令模式,插入模式,可视模式.鼠标可以启动于各种模式中: The ...
- 希捷硬盘扩容软件-----DiscWizard
SeagateDiscWizard可为Seagate磁盘驱动器的使用提供便利.DiscWizard可帮助您迅速安装新的磁盘驱动器.并通过安装向导指导您在磁盘驱动器上完毕分区的创建和格式化. DiscW ...
- TCP的滑动窗口与拥塞窗口
一.滑动窗口 滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的. 对ACK的再认识,ack ...