Android在线升级相关笔记一(解析服务器版本与当前版本比较)

大概流程:Android客户端去访问服务器上的封装了版本号等信息的xml文件,对服务器上的版本和当前版本进行比较,

如果低于服务器的版本,则下载服务器上的新版软件,进行安装替换,完成升级。

一、首先用tomcat搭建服务器,用于开发测试。

下载tomcat请参考:http://blog.csdn.net/only_tan/article/details/25110625

1.在tomcat中新建自己的项目:

\apache-tomcat-6.0.39\webapps 目录下新建自己的项目文件夹,如myapp

然后在myapp文件夹中放入xml,apk等文件;

如,我的myapp项目中放入了upgrade.xml和一个Test.apk文件;

2.访问自己的项目:

PC浏览器打开xml:http://localhost:8080/myapp/upgrade.xml

Android设备打开xml:http://10.0.2.2:8080/myapp/upgrade.xml(或将10.0.2.2换成本机IP)

打开apk文件方法同理,正常情况会弹出下载对话框。

如,Test.apk的下载地址http://10.0.2.2:8080/myapp/Test.apk

如果tomcat中的文件不可下载(如apk等)访问错误,解决如下:

方法1:

把要下载的文件放到tomcat/webapps/ROOT目录下,访问http://本机IP:8080/下载的文件名(或http://10.0.2.2:8080/文件名);

方法2:在apache-tomcat-6.0.39\conf\web.xml中添加以下内容:

<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xls</extension>
<mime-type>application/msexcel</mime-type>
</mime-mapping>
<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>
<mime-mapping>
<extension>zip</extension>
<mime-type>application/zip</mime-type>
</mime-mapping>
<mime-mapping>
<extension>rar</extension>
<mime-type>application/rar</mime-type>
</mime-mapping>
<mime-mapping>
<extension>txt</extension>
<mime-type>application/txt</mime-type>
</mime-mapping>
<mime-mapping>
<extension>chm</extension>
<mime-type>application/mshelp</mime-type>
</mime-mapping>

保存,然后重启tomcat即可。

二、访问服务器,解析xml文件内容;

1.服务器上的xml文件内容:(里面主要有3个元素,版本号、url地址、相关信息)

<upgrade>
<version>2</version>
<url>http://10.0.2.2:8080/myapp/Test.apk</url>
<about>版本更新至2.0,谢谢!</about>
</upgrade>

2. 新建一个实体类:(针对xml内容,封装需要得到的版本等元素)

public class UpdataInfo {

    private int version;
    private String url;
    private String about;  

    public int getVersion() {
        return version;
    }
    public void setVersion(int version) {
        this.version = version;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getAbout() {
        return about;
    }
    public void setAbout(String about) {
        this.about = about;
    }  

}

3.用pull解析器解析xml内容;(需传入一个InputStream)

    public UpdataInfo getUpdataInfo(InputStream is) throws Exception{

         UpdataInfo info = null;
        XmlPullParser  parser = Xml.newPullParser();
        parser.setInput(is, "GB2312");//设置解析的数据源,编码格式
        int event = parser.getEventType();
        while(event != XmlPullParser.END_DOCUMENT ){
            switch (event) {
            case XmlPullParser.START_DOCUMENT: //开始解析
                //可在此做初始化相关工作
                info = new UpdataInfo();
Log.i("UpdatePullParser", "--START_DOCUMENT--");
                break;
            case XmlPullParser.START_TAG:
Log.i("UpdatePullParser", "--START_TAG--");
                String tag = parser.getName();
                if("version".equals(tag)){
                    info.setVersion(new Integer(parser.nextText())); //获取版本号
                }else if ("url".equals(tag)){
                    info.setUrl(parser.nextText()); //获取url地址
                }else if ("about".equals(tag)){
                    info.setAbout(parser.nextText()); //获取相关信息
                }
                break;
            case XmlPullParser.END_TAG://读完一个元素,如有多个元素,存入容器中
                break;
            default:
                break;
            }
            event = parser.next();
        }
        return info;   //返回一个UpdataInfo实体
    }

4.获取xml内容,返回一个InputStream,以便解析所需; 

  public InputStream getXml() throws Exception {
 	 String TAG="URLConnect";
         String httpUrl = "http://10.0.2.2:8080/myapp/upgrade.xml";        

        HttpURLConnection conn = (HttpURLConnection)new URL(httpUrl).openConnection();
        conn.setReadTimeout(5*1000);  //设置连接超时的时间
  //    conn.setRequestMethod("GET");
        conn.connect(); //开始连接
        if(conn.getResponseCode() == 200){
            InputStream is = conn.getInputStream();
            return is;   //返回InputStream
        } else {
  Log.e(TAG, "---连接失败---");
        }
        conn.disconnect(); //断开连接
        return null;
    }

5.在某个触发事件中进行调用,得到服务器的版本号;

 private int mLocalVersion = 1;  //本地版本
 private int mServerVersion = 2; //服务器版本
//调用获得和解析xml的方法,(异步或线程中操作);
private void check(){
  	new Thread(){
            @Override
            public void run(){
            //需要在线程执行的方法
                try {
                 InputStream is = getXml();   //获取xml内容
                 UpdataInfo info = getUpdataInfo(is);  //调用解析方法
		mServerVersion = info.getVersion();  //获得服务器版本
 Log.i(TAG, "check--infoVersion="+info.getVersion()+"infoURL="+info.getUrl()
         +"infoAbout="+info.getAbout());
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            //给handler发送一个消息
            mHandler.sendEmptyMessage(new Message().what=1);
            	}
            }.start();
	}
//Handler消息接收机制
 private Handler mHandler =new Handler(){
   //Handler接收到相应消息进行刷新ui等操作
    public void handleMessage(Message msg){
    super.handleMessage(msg);
        if(msg.what == 1){
	      //收到消息,在此进行ui相关操作,如将解析的内容显示出来。
        }
     }
  };

6.获取本地版本号,与服务器的版本号对比;

//获取本地版本方法
    void getLocal(){
        PackageInfo packageInfo;
        try {
            packageInfo = getApplicationContext()
                    .getPackageManager().getPackageInfo(getPackageName(), 0);
            mLocalVersion = packageInfo.versionCode;
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

到这里,服务器的版本号和本地版本号都已有了,剩下的就是比较大小;

 if(mLocalVersion < mServerVersion){
                      //有新版本,需要升级
                  } else {
                      //不需升级
                  }

------------------------------OK先记录到这里,有空再继续-------------------thanks!-------------------

Android在线升级相关笔记一(解析服务器版本与当前版本比较),布布扣,bubuko.com

时间: 2024-10-12 00:46:07

Android在线升级相关笔记一(解析服务器版本与当前版本比较)的相关文章

android 在线升级借助开源中国App源码

http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: 1: checkAppUpdate 检查是或需要升级 // 网络连接判断         if (appContext.isNetworkConnected()) {             // 检查新版本             if (appContext.isCheckUp()) {                    UpdateM

MySQL学习笔记(3) - 查询服务器版本,当前时间,当前用户

1 SELECT VERSION(); --显示当前服务器版本 2 SELECT NOW(); --显示当前日期时间 3 SELECT USER(); --显示当前用户 MySQL中语句规范: 1.关键字和函数名大写.(小写也可识别) 2.数据库,表,字段全部小写. 3.每条语句分号结尾.

BS网站在线升级(服务器通信)

背景:日前公司需要将客户企业站增加在线升级功能.即客户登录自身网站管理后台后台,发生请求到我公司门户网站,如果存在新版本则提示用户更新.客户从我们公司买到的空间.数据库.和网站代码后可以直接根据智能提示完成webconfig配置,后期客户可以从我们手中购买网站模版实现个性化风格主题的网站设置.我们所有客户的网站结构是一模一样的.因为前台客户浏览的页面均为代码自动生成的静态页,所以更新过程不影响访客浏览. 分析:BS架构项目不同与CS架构——通过请求检测版本更新后返回更新包,根据本地安装目录即可完

Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- Android包 : android.net 包 (1接口, 19类, 3枚举, 1异常), android.net.http 包 (6类), android.net.nsd 包 (3接口, 2类), android.net.rtp (4类), android.net.sip 包 (1接口, 9类, 1

Android 网络编程 API笔记 - java.net 包相关 接口 api

Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- Android包 : android.net 包 (1接口, 19类, 3枚举, 1异常), android.net.http 包 (6类), android.net.nsd 包 (3接口, 2类), android.net.rtp (4类), android.net.sip 包 (1接口, 9类, 1

软件更新相关,使用utuils框架在线升级,显示progressDialog,下载完成后自动弹出安装界面。

使用utuils框架在线升级,显示progressDialog,下载完成后自动弹出安装界面. 1 private void updateDownload() { 2 //检测内存设备是否可用 3 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 4 //设置存储路径 5 final String targer = Environment.getExternalStorageDirectory

Android中Activity与Task相关的属性解析

与Task相关的属性解析 android:allowTaskReparenting 用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)--"true",表示能移动,"false",表示它必须呆在启动时呆在的那个Task里.    如果这个特性没有被设定,设定到<application>元素上的allowTaskReparenting特性的值会应用到Activity上.默认值为"fals

android apk在线升级

现在android开发,一般采用的是CS模式,那么apk的升级,自然而然需要有server端的支持.一般,我们将升级版本以及一个记录升级版本的配置文件(在本文中采用jsonarray格式)放在server端.当Client初始化时,如果检测到server端有更新的版本(读取server的配置文件),则将在server端的升级版本以Http的方式连接,将其下载下来,然后调用android的api进行替换升级. 一.配置文件: update_version.json [{"appname"

OTA制作及升级过程笔记【转】

本文转载自:http://www.it610.com/article/5752570.htm 1.概述 1.1   文档概要 前段时间学习了AndroidRecovery模式及OTA升级过程,为加深理解和防止以后遗忘,所以写这篇文档进行一个总结和梳理,以便日后查阅回顾.文档主要包括两部分,第一部分为OTA升级包的制作过程分析,第二部分为Recovery模式下OTA升级包安装过程的分析,其中包括Recovery模式分析及服务流程. 1.2   参考文献 <Recovery 开发指导> <A