思路:
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>
运行效果如下: