標籤:android 伺服器 pull解析 版本 線上升級
大概流程: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!-------------------