Android線上升級相關筆記一(解析伺服器版本與目前的版本比較)

來源:互聯網
上載者:User

標籤: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!-------------------




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.