Android應用程序的自動更新升級(自身升級、經過tomcat)(轉)

Android應用程序的自動更新升級(自身升級、經過tomcat)android

http://blog.csdn.net/mu0206mu/article/details/7204746web

 

剛入手android一個多月,因公司須要提交技術文檔,才寫了這個demo測試,想保存下來,以備後用!有什麼不對的地方歡迎你們指正,這個示例也是參考了網上別人的demo本身作的。   正則表達式

                                                                                     Android應用程序的升級(自身升級)json

1、       引言:api

    不少的Android應用都具備版本檢測和自動更新的功能,用戶一鍵就能夠完成軟件的升級和更新。Android應用程序的升級本質上是利用了Linux系統的軟件包管理和安裝機制,而對於上層這一功能的開發來講很容易,只須要咱們開發人員利用Android自帶的API就能夠實現。數組

2、     功能說明:tomcat

一、本示例用來實現單個應用程序的自身升級服務器

二、程序啓動時,鏈接tomcat7 web服務器進行版本的檢測,如有新版本則提示更新網絡

三、將從web服務器下載的新版本的APK文件放到sdcard中app

四、監聽新版本的APK應用是否安裝完成,若是是,則將下載的apk文件從sdcard中刪除

3、     程序框架流程:


                         

4、     環境說明:

一、 服務器端:Ubuntu下的tomcat7web服務器,安裝後默認端口是8080,Android模擬器訪問時要將apk文件放到 /var/lib/tomcat7/webapps/ROOT/目錄下,Android模擬器的訪問方式是http://10.0.2.2/NewAppSample.apk

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

Ubuntu+eclipse+ADT

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

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

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

b)  編輯應用程序對應的版本信息文件version.json

說明:後綴爲json的文件是一種輕量級的數據交換格式,比xml要快不少,適合於小型數據的網絡交換,其實質相似鍵值對,鍵用字符串的形式表示與其值用冒號隔開,能存儲多種數據類型。

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

一、在其AndroidManifest.xml中定義版本代碼爲versionCode=」1」讓其自動生成便可,咱們主要利用程序的版本代碼的高低來判斷是否有新的版本,用於更新。

二、咱們在應用程序啓動時自動聯網檢測是否有新的版本,即在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文件的刪除操做。

6、  Demo效果圖例:

       1.提示更新

       2.下載新版本的應用

       3.提示是否安裝

       4.進入系統安裝提示

       5.正在安裝

       6.安裝完成

       7.打開新版本的應用

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,應用程序的替換監聽好像只能監聽自身被替換,這一點待考察。

源碼下載地址:本篇源碼下載

8、 JSON附文:

JSON的定義

一種輕量級的數據交換格式,具備良好的可讀和便於快速編寫的特性。業內主流技術爲其提供了完整的解決方案(有點相似於正則表達式 ,得到了當今大部分語言的支持),從而能夠在不一樣平臺間進行數據交換。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類拋出的異常信息。

相關文章
相關標籤/搜索