Android(2)—Mono For Android App版本自動更新
0.前言
公司Android查詢的專案已經開始,整體採用Java後臺+App前臺來實現,由於專案小,App這塊就我一個人開發,首先需要研究的是:Android版本的更新升級問題;本人經過近一週的學習整理,
終於有了個Demo,開發環境:VS2012+Mono4.8.00013破解版 測試手機:三星I9220 Note1
1.已實現的功能和邏輯
1)採用後臺服務的方式進行下載
2)下載過程中通知欄顯示,並顯示下載進度
3)下載介面採用非同步方式更新進度條
4)下載完成後點選進行安裝-啟動新版本
2.已知BUG和待完善的地方
1)BUG-從通知欄進入更新介面後,然後按返回鍵-接著再從通知欄進入更新介面,更新介面的資料就完全被初始化了
2)待完善-更新過程中切換通知欄和介面間有點卡
3)待完善-下載完成後點選通知欄,通知欄的資訊未消失
4)待完善-安裝完成後未刪除下載的程式
5)待完善-下載過程中需要在通知欄一直顯示,類似於微信未讀資訊的顯示
6)待完善-未新增下載過程中暫停的操作
7)待完善-網路異常及超時未處理
3.程式實現(1)- 更新邏輯
谷歌建議我們使用VersionCode自增來表明版本升級,無論是大的改動還是小的改動,而VersionName是顯示給使用者的軟體版本。所以我們選擇VersionCode作為我們定義版本升級的引數。
而定義VersionCode是在AndroidManifest.xml檔案中manifest節點中增加android:versionCode="1" android:versionName="1.0",然後與伺服器端版本進行比較,實現如下:
4.程式實現(2)- 建立服務
為了在更新的過程中使用者能夠同時操作App,我們需要將下載的過程用服務來實現,服務中需要做的就是通知欄顯示、下載更新和重新整理下載進度全域性變數,以便下載介面獲取;
5.程式實現(3)- 非同步重新整理進度條
為了友好地使用者操作,下載過程中需要重新整理介面中的進度條和文字資訊,以告訴使用者下載未停止,這裡採用的是非同步的方式,非同步DoInBackground方法中需要執行PublishProgress函式
OnProgressUpdate方法才會起作用,可以理解為後臺推送進度的更改,這樣才會觸發OnProgressUpdate事件;
6.程式實現(4)- 下載完成後進行安裝
下載完成後需要讓使用者安裝程式,安裝的程式碼如下,我之所以單獨帖出來,是因為這個地方卡了很久,之前就少了一句,希望對大家有所幫助:
1 public static void InstallNewApk(Context m_Context) 2 { 3 Intent ite = new Intent(Intent.ActionView); 4 string filePath = m_Context.Resources.GetString(Resource.String.FilePath); 5 var uriPath = Android.Net.Uri.Parse(@"file://" + filePath); 6 ite.SetDataAndType(uriPath, @"application/vnd.android.package-archive"); 7 ite.SetFlags(ActivityFlags.NewTask);//這句很關鍵,沒有這句安裝完成後不會彈出“完成”和“開啟”的對話方塊; 8 m_Context.StartActivity(ite); 9 }
7.測試方法
本地安裝1.0版本,然後將2.0的版本放到服務端,配置String.xml裡的DownLoadUrl引數,這樣就可以進行測試了,該程式只在內網WLAN下測試完成,其他測試需要繼續進行;
8.共同進步
原始碼的下載地址為:http://pan.baidu.com/s/1tfHpW 我希望有需要的同學可以下載並完善這個Demo,我之後會把更新的這些資訊放在本博文的後面,希望各位大牛不吝惜自己的知識,共同學習;
程式碼中有不恰當地方希望各位同學熱情指出;
9.小結&致謝
在研究該功能時,參考的資料大多是Java的,轉換過程有點累人,個別資料都還是比較有參考價值的,感謝這些作者,特別感謝網友【綠豆莢】、【/aiq十三樓丶樓主】的不吝指教。
10.BUG修改&細節完善 (期待各位同學的解答)