Android應用程式的自動更新升級(自身升級、通過tomcat)

來源:互聯網
上載者:User

            

剛入手android一個多月,因公司需要提交技術文檔,才寫了這個demo測試,想儲存下來,以備後用!有什麼不對的地方歡迎大家指正,這個樣本也是參考了網上別人的demo自己做的。   

                                                                                     Android應用程式的升級(自身升級)

一、       引言:

    很多的Android應用都具有版本檢測和自動更新的功能,使用者一鍵就可以完成軟體的升級和更新。Android應用程式的升級本質上是利用了Linux系統的軟體包管理和安裝機制,而對於上層這一功能的開發來說很容易,只需要我們開發人員利用Android內建的API就可以實現。

二、     功能說明:

1、本樣本用來實現單個應用程式的自身升級

2、程式啟動時,串連tomcat7 web伺服器進行版本的檢測,若有新版本則提示更新

3、將從web伺服器下載的新版本的APK檔案放到sdcard中

4、監聽新版本的APK應用是否安裝完成,如果是,則將下載的apk檔案從sdcard中刪除

三、     程式架構流程:


                         

四、     環境說明:

1、 伺服器端:Ubuntu下的tomcat7web伺服器,安裝後預設連接埠是8080,Android模擬器訪問時要將apk檔案放到 /var/lib/tomcat7/webapps/ROOT/目錄下,Android模擬器的訪問方式是http://10.0.2.2/NewAppSample.apk

2、 Android模擬器端的開發環境:

Ubuntu+eclipse+ADT

五、     流程詳解及關鍵點說明:

(一)   新版本的應用程式(NewAppSample)準備:

a)  建立一個android工程,編輯其版本代碼為2,高於我們的舊版本用於更新測試,版本名稱為1.0.1

b)  編輯應用程式對應的版本資訊檔version.json

說明:尾碼為json的檔案是一種輕量級的資料交換格式,比xml要快很多,適合於小型資料的網路交換,其實質類似索引值對,鍵用字串的形式表示與其值用冒號隔開,能儲存多種資料類型。

(二) 舊版本的應用程式準備:

1、在其AndroidManifest.xml中定義版本代碼為versionCode=”1”讓其自動產生即可,我們主要利用程式的版本代碼的高低來判斷是否有新的版本,用於更新。

2、我們在應用程式啟動時自動連網檢測是否有新的版本,即在onCreate()函數中進行連網檢測。

a)  從伺服器獲得讀取版本資訊檔version.json,我們單獨寫了一個類來實現,用其GetUpdateInfo靜態方法來返回讀取的version.json,返回形式是字串。代碼如下

b)  獲得當前舊的應用程式版本資訊,我們單獨封裝了一個類CurrentVersion,用其中的靜態方法來獲得當前應用的版本資訊,包括程式的名稱版本,代碼版本,和應用程式名稱字。

代碼如下:

c)  將從伺服器version.json獲得的字串解析出我們需要的版本資訊

d)  進行代碼版本的比較,提示是否更新當前的應用。

(三)    顯示更新提示框

 


(四)    下載新的APK檔案


下載完成時要將進度條對話方塊取消並進行是否安裝新應用的提示

(五)    安裝新的應用:


Intent的setDataAndType的一個參數是應用程式的絕對路徑(在sdcard中),第二個參數是檔案對應的MIME類型,android系統中的APK檔案預設為application/vnd.android.package-archive,該檔案的MIME類型在tomcat伺服器中的/var/lib/tomcat7/conf檔案中有對應。

(六)    網路檢測代碼和sdcard中APK檔案的刪除

 

         關鍵說明:若不用廣播接收的方式,直接在安裝後的代碼中實現刪除下載的APK檔案的話,會出現還沒安裝完成就把APK檔案刪除了的情況。在進入安裝新的APK檔案時會進入系統的提示進行一步一步的安裝操作,所以我們無法判斷應用程式什麼時候完整安裝完成。我們用監聽(應用程式安裝或替換的)廣播的方式來實現,當接受到應用程式有ADDED或則REPLACED的廣播時我們再執行APK檔案的刪除操作。

六、  Demo例:

       1.提示更新

       2.下載新版本的應用

       3.提示是否安裝

       4.進入系統安裝提示

       5.正在安裝

       6.安裝完成

       7.開啟新版本的應用

七、      完成過程中出現的問題以及關鍵點說明:

1.      Android模擬器串連tomcat7伺服器下載時訪問地址IP不能用localhost,因為android模擬器把localhost當成自己了,應該用10.0.2.2測試

2.      下載的APK檔案和版本資訊的json檔案應該放在/var/lib/tomcat7/webapps/ROOT/目錄下不然無法訪問到。

3.      JSON檔案的解析方式參考JSON附文理解。

4.      樣本中涉及到的許可權:

a)        與sdcard相關的許可權:樣本中我們需要在sdcard中建立和刪除檔案的許可權和sdcard的讀寫權限。

b)        與網路相關的許可權:樣本中我們需要訪問網路的許可權和獲得網路狀態的許可權(測試網路是否可用),樣本中我們只測試了網路是否可用,我們還可以添加網路是否已經串連的進一步判斷。

5.      監聽應用程式是否安裝完成

在工程的Manifest.xml檔案中添加要接受的廣播action,這裡我們監聽應用程式本身的替換和系統中應用程式的添加兩個action,應用程式的替換監聽好像只能監聽自身被替換,這一點待考察。

源碼:本篇源碼下載八、 JSON附文:JSON的定義:

一種輕量級的資料交換格式,具有良好的可讀和便於快速編寫的特性。業內主流技術為其提供了完整的解決方案(有點類似於Regex ,獲得了當今大部分語言的支援),從而可以在不同平台間進行資料交換。JSON採用相容性很高的文字格式設定,同時也具備類似於C語言體系的行為。 

為什麼用JSON?

很簡單,因為它比xml快十倍。

有哪些應用案例?

         Twitter、豆瓣、facebook等公司的開放api,一般這些服務都會提供多種格式供開發人員選擇(xml、json、atom等),而在手機終端上,我們自然希望給使用者最佳體驗,所以我選用最有效率的json格式。

JSON的結構:

Name/ValuePairs             類似所熟知的Keyedlist、Hash table、Disctionary和Associative array。在Android平台中同時存在另外一個類“Bundle”,某種程度上具有相似的行為。

org.json.JSONObject     Array,一組有序的資料列表。 

Android中 JSON相關的類(4個)和Exceptions(1個):

l  JSONArray

l  JSONObject

l  JSONStringer

l  JSONTokener

l  JSONException

 

JSONObject:

這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(External:應用toString()方法輸出的數值)調用的響應體現為一個標準的字串(例如:{"JSON": "Hello, World"},最外被大括弧包裹,其中的Key和Value被冒號":"分隔)。其對於內部(Internal)行為的操作格式略微,例如:初始化一個JSONObject執行個體,引用內部的put()方法添加數值:newJSONObject().put("JSON", "Hello, World!"),在Key和Value之間是以逗號","分隔。

Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者預設值JSONObject.NULL object。

有兩個不同的取值方法:

get(): 在確定數值存在的條件下使用,否則當無法檢索到相關Key時,將會拋出一個Exception資訊。

opt(): 這個方法相對比較靈活,當無法擷取所指定數值時,將會返回一個預設數值,並不會拋出異常。

JSONArray:

它代表一組有序的數值。將其轉換為String輸出(toString)所表現的形式是用方括弧包裹,數值以逗號”,”分隔(例如:[value1,value2,value3],大家可以親自利用簡短的代碼更加直觀的瞭解其格式)。這個類的內部同樣具有查詢行為,get()和opt()兩種方法都可以通過index索引返回指定的數值,put()方法用來添加或者替換數值。 

同樣這個類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者預設值JSONObject.NULL object。

JSONStringer:

根據官方的解釋,這個類可以協助快速和便捷的建立JSON text。其最大的優點在於可以減少由于格式的錯誤導致程式異常,引用這個類可以自動嚴格按照JSON文法規則(syntaxrules)建立JSON text。每個JSONStringer實體只能對應建立一個JSON text。 

根據下邊的執行個體來瞭解其它相關資訊:

string myString= new JSONStringer().object()

.key("AR").value("www.Androidres.com!")

.endObject()

.toString();

結果是一組標準格式的JSON text:{”AR”:”www.Androidres.com!”} 

其中的.object()和.endObject()必須同時使用,是為了按照Object標準給數值添加邊界。同樣,針對數組也有一組標準的方法來產生邊界.array()和.endArray()。

JSONTokener:

這個是系統為JSONObject和JSONArray構造器解析JSON source string的類,它可以從source string中提取數值資訊。 

JSONException:

是JSON.org類拋出的異常資訊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.