Android 一步一步实现版本自动更新(第一步 解析是否需要更新)

本文介绍了如何在Android应用中实现自动检查版本更新。通过在Tomcat服务器上放置XML文件,存储最新版本信息,客户端通过HTTP请求获取并比对版本号,决定是否需要更新。详细步骤包括配置Tomcat,解析XML,以及在Android应用中使用线程和Handler进行异步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

1、在tomcat上放置xml文件,文件里存放最新的版本号信息,客户端通过http的方式访问xml文件来获取最近的版本信息;

2、客户端比对版本信息来判断是否需要更新;

 

由于通过网络来访问xml文件,需要需要启用线程来进行xml文件的访问,同时将线程访问得到在hashmap传给主线程,主线程比对版本信息。

 

Tomcat上的配置如下:

E:\android\tomcat\conf  tomcat的配置目录:下的:server.xml文件的<host>中加入

<Context docBase="E:\MyEclipse\MYworkspace\zoomactechppm\versionupdatedir" path="/versionupdatedir"   ></Context>

docBase为xml文件的存放目录,path为http访问的子路径。

新版本的配置文件名为:versioninfo.xml

<xml version="1.0" encoding="utf-8">

  <appversion>10001</appversion>
  <appfilename>appfile01</appfilename>
  <appurl>http://localhost:8080/VersionUpdateDir/appfile01.apk</appurl>
</xml>

保证客户机通过http能访问xml.显示结果如下图:


代码如下:

//ParseVersionInfo类为工具类,用来解析xml文件的内容,通过hasmap的方式返回。

package com.zoomactech.projectprogressmanager.tools;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.PublicKey;
import java.util.HashMap;

import javax.security.auth.PrivateCredentialPermission;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.os.Handler;
import android.util.Log;

public class ParseVersionInfo {

 private HashMap<String, String> resulthashMap = new HashMap<String, String>();

//创建获取配置信息的方法,通过hashmap的方式返回最近版本信息。

 public HashMap<String, String> parseXml(final String url) throws Exception {

  
  class Newthread extends Thread{

    public void run() {

     // TODO Auto-generated method stub

     // TODO Auto-generated method stub

     // TODO Auto-generated method stub
     URL versioncheckurl = null;
     try {
      versioncheckurl = new URL(url);

     } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
     }
     HttpURLConnection httpconnection = null;
     try {
      httpconnection = (HttpURLConnection) versioncheckurl
        .openConnection();

     } catch (Exception e) {
      // TODO: handle exception
     }

     httpconnection.setConnectTimeout(5000);
     InputStream inputStream = null;
     try {
      inputStream = httpconnection.getInputStream();
     } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
     }

     DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
       .newInstance();
     DocumentBuilder documentBuilder;
     // HashMap<String, String> hashMap = new HashMap<String,
     // String>();
     try {
      documentBuilder = documentBuilderFactory
        .newDocumentBuilder();

      try {
       Document document = documentBuilder.parse(inputStream);
       Element root = document.getDocumentElement();
       NodeList nodeList = root.getChildNodes();
       // 遍历xml上所有子节点信息放入hashmap;

       for (int i = 0; i < nodeList.getLength(); i++) {
        Node childNode = (Node) nodeList.item(i);
        if (childNode.getNodeType() == Node.ELEMENT_NODE) {
         Element childElement = (Element) childNode;
         if ("appversion".equals(childElement
           .getNodeName())) {
          resulthashMap.put("appversion",
            childElement.getFirstChild()
              .getNodeValue());
         } else if ("appfilename".equals(childElement
           .getNodeName())) {
          resulthashMap.put("appfilename",
            childElement.getFirstChild()
              .getNodeValue());
         } else if ("appurl".equals(childElement
           .getNodeName())) {
          resulthashMap.put("appurl", childElement
            .getFirstChild().getNodeValue());
         }
         // System.out.println(resulthashMap.toString());
         // System.out
         // .println("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
        }
       }

      } catch (SAXException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }

     } catch (ParserConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    
     
    }

  }


   Newthread newthread = new Newthread();

   newthread.start();

//使用join方法解决hashmap不同步的问题,保证解析完成后返回hashmap.
   newthread.join();
  
   return resulthashMap;

 }

}

activity上的代码:

package com.zoomactech.projectprogressmanager;

import java.io.InputStream;
import java.util.HashMap;

import com.zoomactech.projectprogressmanager.baseclass.CustomProgressDialog;
import com.zoomactech.projectprogressmanager.config.ConfigureForPPM;
import com.zoomactech.projectprogressmanager.config.paramsForPPM;
import com.zoomactech.projectprogressmanager.tools.ParseVersionInfo;

import android.R.integer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.printservice.PrintService;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;

public class ChooseAliveServer extends Activity {


  private CustomProgressDialog checkserverCustomProgressDialog,checkversionProgressDialog;

//定义两个数字常量来记录当前版本号和解析到的版本号

  private int currentversioncode,updateversioncode;
  @SuppressLint("HandlerLeak")

super.onCreate(savedInstanceState);
  setContentView(R.layout.choose_alive_server_layout);
//直接调用 
 checkappversion();    

  
 
 //检查是否有新版本更新,如果无更新,直接进入WelcomeActivity,如果有更新,弹出更新对话框。
 
  public void checkappversion(){
//自定义的对话框,代码略   
   checkversionProgressDialog = CustomProgressDialog
     .createDialog(ChooseAliveServer.this);
   checkversionProgressDialog.setCancelable(false);
   checkversionProgressDialog.setTitile("正在检查版本更新信息");
   checkversionProgressDialog.setMessage("正在检查版本更新信息.....");
   checkversionProgressDialog.show();
   
   if(isAppNeedUpdate()){
    checkversionProgressDialog.dismiss();
    
    final AlertDialog appversionAlertDialog = new AlertDialog.Builder(
      ChooseAliveServer.this).create();
    appversionAlertDialog.show();
    appversionAlertDialog
      .setContentView(R.layout.customer_alertdialog_model01);
    appversionAlertDialog.setCancelable(false);
    TextView successtitle = (TextView) appversionAlertDialog
      .findViewById(R.id.cs_alert_01_title);
    successtitle.setText("更新提示");
    TextView successcontent = (TextView) appversionAlertDialog
      .findViewById(R.id.cs_alert_01_content);
    successcontent.setText("当前版本号为"+currentversioncode+",最新版本号为"+updateversioncode+",点击确定进行更新!");    appversionAlertDialog

    .findViewById((R.id.cs_alert_01_yes))
      .setOnClickListener(new OnClickListener() {

       @Override
       public void onClick(View v) {
        // TODO
        // Auto-generated
        // method
        // stub

      //这里只弹出个提示,下一节实现下载更新
        Toast.makeText(ChooseAliveServer.this, "您选择了更新!", Toast.LENGTH_LONG).show();
        appversionAlertDialog.dismiss();
       
       }
      });
    appversionAlertDialog.findViewById(
      (R.id.cs_alert_01_no)).setOnClickListener(
      new OnClickListener() {

       @Override
       public void onClick(View v) {
        // TODO
        // Auto-generated
        // method
        // stub
        //        
        appversionAlertDialog.dismiss();
        Toast.makeText(ChooseAliveServer.this, "取消更新可能会导致某些新功能不可用,如遇此类问题请重启APP更新!", Toast.LENGTH_LONG).show();
        Intent welcomeIntent = new Intent();
        welcomeIntent.setClass(ChooseAliveServer.this,
          WelcomeActivity.class);
        // welcomeIntent.putExtra("serverip", serverip);
        startActivity(welcomeIntent);
        finish();
       }
      });

   }
   if(!isAppNeedUpdate()){
   checkversionProgressDialog.dismiss();
   Toast.makeText(ChooseAliveServer.this, "已是最近版本无需更新!", Toast.LENGTH_LONG).show();
   Intent welcomeIntent = new Intent();
   welcomeIntent.setClass(ChooseAliveServer.this,
     WelcomeActivity.class);
   // welcomeIntent.putExtra("serverip", serverip);
   startActivity(welcomeIntent);
   finish();
   }
   
   
  }
  
//创建判断是否要更新配置的方法:  
 private boolean isAppNeedUpdate()
     {
         // 获取当前软件版本
         currentversioncode = getAppVersionCode(ChooseAliveServer.this);
         //System.out.println("DDDDDDDDDDDDDDDDDD currentversion is"+versionCode);
        
         // 把version.xml放到网络上,然后获取文件信息
        
         paramsTranc = (paramsForPPM) getApplication();
   String login_server_ip = paramsTranc.getLogin_server_ip();
   String appversionXMLurl="http://192.168.0.57:8080/versionupdatedir/versioninfo.xml";
   
      
         // 解析XML文件。 由于XML文件比较小,因此使用DOM方式进行解析
         ParseVersionInfo parseVersionInfo = new ParseVersionInfo();
         HashMap<String, String> mHashMap= new HashMap<String, String>();
         try
         {
             mHashMap = parseVersionInfo.parseXml(appversionXMLurl);
            
           //  System.out.println("EEEEEEEEEEEEEEEEE new version"+mHashMap.toString());
         } catch (Exception e)
         {
             e.printStackTrace();
         }
         if (null != mHashMap)
         {
             updateversioncode = Integer.valueOf(mHashMap.get("appversion"));
             //System.out.println("FFFFFFFFF NEW version is"+serviceCode);
             // 版本判断
             if (updateversioncode > currentversioncode)
             {
                 return true;
             }
         }
         return false;
     }  
  //创建获取当前app版本号的方法:
  private int getAppVersionCode(Context context){
   int currentAppversionCode=0;
   try{
    currentAppversionCode=context.getPackageManager().getPackageInfo
      ("com.zoomactech.projectprogressmanager",0).versionCode;
   }catch(NameNotFoundException e){
    e.printStackTrace();
   }
   //System.out.println("HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH current version"+currentAppversionCode);
   return currentAppversionCode;
  }

 }

 

 

修改app版本信息:

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zoomactech.projectprogressmanager"
    android:versionCode="10002"
    android:versionName="1.0" >

将xml版本号调高:

<xml version="1.0" encoding="utf-8">

  <appversion>10003</appversion>
  <appfilename>appfile01</appfilename>
  <appurl>http://localhost:8080/VersionUpdateDir/appfile01.apk</appurl>
</xml>

 

 

运行效果如下:

 


 

 

 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值