大概流程: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!-------------------