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修改&細節完善 (期待各位同學的解答)