Android應(yīng)用程序的自動(dòng)更新升級(jí)_第1頁(yè)
Android應(yīng)用程序的自動(dòng)更新升級(jí)_第2頁(yè)
Android應(yīng)用程序的自動(dòng)更新升級(jí)_第3頁(yè)
Android應(yīng)用程序的自動(dòng)更新升級(jí)_第4頁(yè)
Android應(yīng)用程序的自動(dòng)更新升級(jí)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android應(yīng)用程序的自動(dòng)更新升級(jí)(自身升級(jí).通過tomcat)剛?cè)胧謅ndroid一個(gè)多月,因公司需要提交技術(shù)文檔,才寫了這個(gè)demo測(cè)試,想保存下來,以備后用!有什么不對(duì)的地方歡迎大家指正,這個(gè)示例也是參考了網(wǎng)上別人的demo自己做的。Android應(yīng)用程序的升級(jí)(自身升級(jí))一、弓I言:很多的Android應(yīng)用都具有版本檢測(cè)和自動(dòng)更新的功能,用戶一鍵就可以完成軟件的升級(jí)和更新。Android應(yīng)用程序的升級(jí)本質(zhì)上是利用了Linux系統(tǒng)的軟件包管理和安裝機(jī)制,而對(duì)于上層這一功能的開發(fā)來說很容易,只需要我們開發(fā)人員利用Android自帶的API就可以實(shí)現(xiàn)。二、功能說明:1、本示例用來實(shí)現(xiàn)單個(gè)應(yīng)用程序的自身升級(jí)2、程序啟動(dòng)時(shí),連接tomcat7web服務(wù)器進(jìn)行版本的檢測(cè),若有新版本則提示更新3、將從web服務(wù)器下載的新版本的APK文件放到sdcard中4、監(jiān)聽新版本的APK應(yīng)用是否安裝完成,如果是,則將下載的apk文件從sdcard中刪除三、程序框架流程:四、環(huán)境說明:1、服務(wù)器端:Ubuntu下的tomcat7web服務(wù)器,安裝后默認(rèn)端口是8080,Android模擬器訪問時(shí)要將apk文件放到/var/lib/tomcat7/webapps/ROOT/目錄下,Android模擬器的訪問方式是/NewAppSample.apk2、Android模擬器端的開發(fā)環(huán)境:Ubuntu+eclipse+ADT五、流程詳解及關(guān)鍵點(diǎn)說明:(一)新版本的應(yīng)用程序(NewAppSample)準(zhǔn)備:a)新建一個(gè)android工程,編輯其版本代碼為2,高于我們的舊版本用于更新測(cè)試,版本名稱為1.0.1?<manifestxmlns:andr0id=11ftttp://schemas,android,com/apk/res/android''package=tlcomJnewappsample*'android:versionCode=M2"android:versionName=tlI.G.JFI><uses-5dkandroid:ratinSdkVersion=nffn/>b)編輯應(yīng)用程序?qū)?yīng)的版本信息文件version.jsonmumu^um:omtat?/wcbgpp$/ROOT[("ippnarif":"MewAppSample","apkname":"NetAppSampI&rapkn,"verNang":L8+1,2BverCfltfe'iZ}]說明:后綴為json的文件是一種輕量級(jí)的數(shù)據(jù)交換格式,比xml要快很多,適合于小型數(shù)據(jù)的網(wǎng)絡(luò)交換,其實(shí)質(zhì)類似鍵值對(duì),鍵用字符串的形式表示與其值用冒號(hào)隔開,能存儲(chǔ)多種數(shù)據(jù)類型。(二)舊版本的應(yīng)用程序準(zhǔn)備:1、在其AndroidManifest.xml中定義版本代碼為versionCode=”1讓其自動(dòng)生成即可,我們主要利用程序的版本代碼的高低來判斷是否有新的版本,用于更新。2、我們?cè)趹?yīng)用程序啟動(dòng)時(shí)自動(dòng)聯(lián)網(wǎng)檢測(cè)是否有新的版本,即在onCreate()函數(shù)中進(jìn)行聯(lián)網(wǎng)檢測(cè)。a)從服務(wù)器獲得讀取版本信息文件version.json,我們單獨(dú)寫了一個(gè)類來實(shí)現(xiàn),用其GetUpdateInfo靜態(tài)方法來返回讀取的version.json,返回形式是字符串。代碼如下

publicstaticStringgetUpdataVerJSON(Stringserv&rPath)throwsException(StringSuildernewVerJSON=newStringBuilder(j;HttpClientclient=bwDefailtHttpCllent(>;//^ht?HttpParamshttpParanis=client.geiParams();HttpConnectionParams.setCafinectiofTTiflrecii/t(httpParams,3000);-:::!1'■;!HtTptonneetionParatns.setS&Tlffleour(httpParan?r5&QQ);//serverpath是作「smflJson的揩役HttpResponseresponse=client,execute(newHttpGetj&erverPath)):Ht西Entityentity=response.getEntity(};if(entityI-nulU{BufferedReaderreader=newBufferedReadertnewInput$treamFteader(entity.getContent(1rifutf-ehi),0152);Stringline=null;whilst(linesreader,readLine(|)null){newverJSQN,append(Une+D\ri-);?.?;..^AStringBuiltier^}reader.closet);rettrnnewVerJ&ON.toString(};}b)獲得當(dāng)前舊的應(yīng)用程序版本信息,我們單獨(dú)封裝了一個(gè)類Currentversion,用其中的靜態(tài)方法來獲得當(dāng)前應(yīng)用的版本信息,包括程序的名稱版本,代碼版本,和應(yīng)用程序名字。代碼如下:publicclassCurrentVersion{privatestaticfinalStringTAG=llConfigN;publicstaticfinalStringappPackName=Ncom.updateapp";publicstaticintgetVerCode(Contextcontext)throwsNameNotFoundException{intverCode=-1;try{verCode=context.getPackageManager().getPackagelnfo(ap^PacfcWame,Q).versioncode;}catchtExceptione){Log.e(TAGte.getMessage()};}returnverCode;}publicstaticStringgetVerName(ContextcontextsStringverName=」;try{verName=context.getPackageManager().getPackagelnfo(appPackNamef0}.versionName;Jcatch(Exceptione){Log.e(77i(jre.getMessagef)1;)returnverName;}publicstaticStringgetAppName(Contextcontext){StringappName=context.getResources()|.getTextfR.string.app_narne}.toStringf];returnappName;c)將從服務(wù)器version.json獲得的字符串解析出我們需要的版本信息

privatebooleangetServerVersianf}{//7000Auto*generate(jmethodstubtry(stringne^verJSQN=GetupdateInfotupdat^verjson(downPath+appversian);JSONArr^yjsonArr^y=newJSONArray(newVerJSON);iffjsonArray.length(J>O)(JSONObj?ctobj=jsonftrray.getJSQNObject(e>;try{newVercade■integer.parseintiobj.getstring(nvercode'));newV?rNaiK=cbj-getString(hverN3me"];}catcti(Exceptione){Log,e(TAG,e,getMe&sa9e(});newVerCode=-1;newVefName='";returnfalse;}catch(ExceptiOnLog.efMG,e^getMessagef1);returnfalse;returntrue;d)進(jìn)行代碼版本的比較,提示是否更新當(dāng)前的應(yīng)用。privatevoidcheckToUpdate()throwsNameNotFoundException{//T000Auto-generatedmethodstubif(getServerVersionfl){intcurrentcode=Currentversion.getVerCode(this);if(newVerCode>currentCode){//CurrentVersionisold〃彈出更新提示對(duì)話梅showUpdateDialog(];(三)顯示更新提示框privatevoidshcwUpdateDialogf)throwsNameMotFoundException(//TODOAuto-generatedmethodstubStringBuffersb=newStringGuffert};sbappend("當(dāng)前版本:4|);sb,append(Currentver$ion.getVerName(thisJ);sb.append(11VerCode:"};sb.append(CurrentVersion.get^erCode(this)};sb.append^Xn11);sb.append(”發(fā)現(xiàn)1站&本;");sb.append(newVerNdfne);sb.append("hte^VerCodesb.append(ne^VerCode);sb.appendf"Xn11);赤.append廣是否史Dialogdialog=newAlertDiaiog.8uilder(UpdateAppActivity.this)箏eVTHIK■軟件更新勺.setMessagefsb.taString()jrsetPositiveButton(11.ifiIrFnewDialogIoterface,OnCUckListenert)(^aOtferridepublicvoidanClick(Dialoglritierfacedialog,intwhich)(//TODOAuto-generatedmethodstubshwProgressBar();/}月.setNegativeButtonf不更新“,newDialogInterface.OnClickListener()(publicvoidonCUck(DialogInterfacedialog,intwhich)(//TODOAuto-generatedmethodstub}^J).treate();dialoG.showfprotectedvoidshowProgressBart){//TODOAuto-generatedmethodstubpBar=newProgressDialog(UpdateAiopActivity.this);pBar.setTitlef11正在下載「');pBar.setMessage('SffS后...;pBar.setProgressSty'Le(Progre5sDia'Log.srKLF_SP7JVWEH);downAppFiletdownPath+appName】;}(四)下載新的APK文件pretextedvoiddownAppFile(finalStringurl){口船r,$hg[》;newThread(J{publicvoidrunlHHttpCUentclient=newDefaultHttptLlent(J;HttpGetget■newHttp6et(url);HttpResponsere^pon^e;try{response=client.^xecute(get):Httptrttityentity二response.getEntityO;longlength=entity.gelContentLength(};L(jg.isizable(HDownTa5H,flnt)Ung(h);InputStreamis=entity.getContentti:FlleOutputStreanifllcoutpgraitneai=null;if(is=null.}{thrflwnewRuntiraeExcEptiont"is^tream15null")Filefile=時(shí)uFiletEnvironmentL5tor3^i?Directory{},appNaee>;flleOjtputS+reani=newFileOuitputStream(file):bytt[]buf=ngb^t*[je24j;lhtch=-1;de(ch=i5.read(buf):if(eti<=e}bruk:fileOutputStreaR.write(buftG,ch}j}while(tnie|:is^losetI;f11eOutputstredm.[):haveDovnLoadf}jitatth(CUtntProtocolExceptione](t.prrntStackTr^c?()j)catchflOEicceptione)(e.pririt5tackTrac£{):}}).start();1下載完成時(shí)要將進(jìn)度條對(duì)話框取消并進(jìn)行是否安裝新應(yīng)用的提示^r&tectedvaidhdueDawnLcad(}(//TODOAuto^^enerated'methodstubhandUr.postfn^RunnahletHpublicvoidruntHpBar.cancel(h"評(píng)出曾答111此承受若玄我盼版本Dialoginstallo-ialog=o?mAUrtoidlcg.BuildertupdateAppActrvity.this).郭tmessaqe("甘否£淞斯削應(yīng)用.f一sttPasitiueflutton〔'恥*DiaL列Inter一OnClitkListentr(J(^OverridepublicvoidonClick(Dialo^lr>terfacedialogdintufiich}(//TODDAuto-generai^dmethedstubin^t^UNewApk(]:finish^;}n靴卵HkButtfin,曲泊二m?hDlaL^lnt?rfa£?.t>nClickLlsten4r(\(^cverridtpublicvoidontLH婦。,占1心gliiterfaBdialogrintwfiith)(//TODOAut'Q'-'^Srierated$t-ubfinishO;})-crest研];tn$tallDiaXog.SliOw{];)});(五)安裝新的應(yīng)用:protectedvoidinstallNewApk[)(//TcDQAuto-generatedmethodstubIntentintent=newIntent(Intent.ACTIONVIEW};intent.setDataAndType(Un.fro^Fileth叫File(Envirorraentretfxterna15torageDirettoryl)rappName))F"application/vndhandroidhpackage-archive");startActivity(intent);}Intent的setDataAndType的一個(gè)參數(shù)是應(yīng)用程序的絕對(duì)路徑(在sdcard中),第二個(gè)參數(shù)是文件對(duì)應(yīng)的MIME類型,android系統(tǒng)中的APK文件默認(rèn)為application/vnd.android.package-archive,該文件的MIME類型在tomcat服務(wù)器中的/var/lib/tomcat7/conf文件中有對(duì)應(yīng)。(六)網(wǎng)絡(luò)檢測(cè)代碼和sdcard中APK文件的刪除privatestaticboaleanisNetworkAvaHableiCQntextcantextl(//TOMAuto'generatednvethodstubtry(ConnectivityManage「cm=(ConnectivityM^nager)contextgetSystemServicefContext*CONNECTIVITYSfffVICE);NetworklnfcnetWarkTnfu=cm..getActiveNetworklnfa();return(netwarkliifonull叫networkinfohisAvailable())用}catch(Exceptione)(e^prjntStackTracet);returnfalse;publicclassReplacesroadcastReceiverextendsBroadcastReceiver{privatestaticfinalString775i&=HApkDeleie-;(^OverridepublicvoidonReceive(ContextargflrIntentargl){//TODDAuto-generatedmethodstubFiledownLoadApk=newFile[Environnient.getExternalS'torageDirectoryt)PI'NewAppSample.apk");if(downLoadApk.exists())(downLoadApk.delete(');}Log.2"downLoadApkFilewasdeleted!H);}I關(guān)鍵說明:若不用廣播接收的方式,直接在安裝后的代碼中實(shí)現(xiàn)刪除下載的APK文件的話,會(huì)出現(xiàn)還沒安裝完成就把APK文件刪除了的情況。在進(jìn)入安裝新的APK文件時(shí)會(huì)進(jìn)入系統(tǒng)的提示進(jìn)行一步一步的安裝操作,所以我們無法判斷應(yīng)用程序什么時(shí)候完全安裝完成。我們用監(jiān)聽(應(yīng)用程序安裝或替換的)廣播的方式來實(shí)現(xiàn),當(dāng)接受到應(yīng)用程序有ADDED或則REPLACED的廣播時(shí)我們?cè)賵?zhí)行APK文件的刪除操作。六、Demo效果圖例:1.提示更新

2.下載新版本的應(yīng)用3.提示是否安裝

4.進(jìn)入系統(tǒng)安裝提示

5.正在安裝

6.安裝完成

7.打開新版本的應(yīng)用七、完成過程中出現(xiàn)的問題以及關(guān)鍵點(diǎn)說明:Android模擬器連接tomcat7服務(wù)器下載時(shí)訪問地址IP不能用localhost,因?yàn)閍ndroid模擬器把localhost當(dāng)成自己了,應(yīng)該用測(cè)試下載的APK文件和版本信息的json文件應(yīng)該放在/var/lib/tomcat7/webapps/ROOT/目錄下不然無法訪問到。JSON文件的解析方式參考JSON附文理解。示例中涉及到的權(quán)限:a)與sdcard相關(guān)的權(quán)限:示例中我們需要在sdcard中創(chuàng)建和刪除文件的權(quán)限和sdcard的讀寫權(quán)限。<use&-permissionandroid:nanie=RIandroid.permission.MOUNT_UNMOUNT_FILESYSTENS,l/><nses-permissionandroid:name=l1android.permission..WRITE_EXTERNALSTORA6F111/>b)與網(wǎng)絡(luò)相關(guān)的權(quán)限:示例中我們需要訪問網(wǎng)絡(luò)的權(quán)限和獲得網(wǎng)絡(luò)狀態(tài)的權(quán)限(測(cè)試網(wǎng)絡(luò)是否可用),示例中我們只測(cè)試了網(wǎng)絡(luò)是否可用,我們還可以添加網(wǎng)絡(luò)是否已經(jīng)連接的進(jìn)一步判斷。<u5es-periris5ionandroid:name=EIandroid.peemission.INTERNET1'/>s-permi5sionandroid:nanie="android.permission.ACCESSNETWORK_STATEr'/>監(jiān)聽?wèi)?yīng)用程序是否安裝完成在工程的Manifest.xml文件中添加要接受的廣播action,這里我們監(jiān)聽?wèi)?yīng)用程序本身的替換和系統(tǒng)中應(yīng)用程序的添加兩個(gè)action,應(yīng)用程序的替換監(jiān)聽好像只能監(jiān)聽自身被替換,這一點(diǎn)待考察。<receiverandroid:na[ne=llflep{acefiroadcast/?eceiver,l><intent-fii_ter^<actionandroid:na(i}e=,1android,intent,action.P4CKAGE_ADDED111/?<actionandroid:naRie=ent.action.PACKAGEREPLACED''/><dataandroid:scheme=Npacfcagell/></receiver>源碼下載地址:本篇源碼下載八、JSON附文::JSON的定義一種輕量級(jí)的數(shù)據(jù)交換格式,具有良好的可讀和便于快速編寫的特性。業(yè)內(nèi)主流技術(shù)為其提供了完整的解決方案(有點(diǎn)類似于正則表達(dá)式,獲得了當(dāng)今大部分語(yǔ)言的支持),從而可以在不同平臺(tái)間進(jìn)行數(shù)據(jù)交換。JSON采用兼容性很高的文本格式,同時(shí)也具備類似于C語(yǔ)言體系的行為。為什么用JSON?很簡(jiǎn)單,因?yàn)樗葂ml快十倍。有哪些應(yīng)用案例?Twitter、豆瓣、facebook等公司的開放api,一般這些服務(wù)都會(huì)提供多種格式供開發(fā)人員選擇(xml、json、atom等),而在手機(jī)終端上,我們自然希望給用戶最佳體驗(yàn),所以我選用最有效率的json格式。JSON的結(jié)構(gòu):Name/ValuePairs類似所熟知的Keyedlist、Hashtable、Disctionary和Associativearray。在Android平臺(tái)中同時(shí)存在另外一個(gè)類“Bundle”某種程度上具有相似的行為。org.json.JSONObjectArray,一組有序的數(shù)據(jù)列表。Android中JSON相關(guān)的類(4個(gè))和Exceptions(1個(gè)):lJSONArraylJSONObjectlJSONStringerlJSONTokenerlJSONExceptionJSONObject:這是系統(tǒng)中有關(guān)JSON定義的基本單元,其包含一對(duì)兒(Key/Value)數(shù)值。它對(duì)外部(External:應(yīng)用toString()方法輸出的數(shù)值)調(diào)用的響應(yīng)體現(xiàn)為一個(gè)標(biāo)準(zhǔn)的字符串(例如:{"JSON":"Hello,World"},最外被大括號(hào)包裹,其中的Key和Value被冒號(hào)”:”分隔)。其對(duì)于內(nèi)部(Internal)行為的操作格式略微,例如:初始化一個(gè)JSONObject實(shí)例,引用內(nèi)部的put()方法添加數(shù)值:newJSONObject().put("JSON","

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論