Android實現App版本自動更新

如今不少的App中都會有一個檢查版本的功能。例如鬥魚TV App的設置界面下:android

                 

當咱們點擊檢查更新的時候,就會向服務器發起版本檢測的請求。通常的處理方式是:服務器返回的App版本與當前手機安裝的版本號進行對比。服務器

(1)若是服務器所返回的版本號大於當前App版本號那麼此時手機所安裝的App不是最新版。能夠提示用戶升級。異步

(2)若是不大於當前版本號,能夠提示用戶爲最新版本:工具

               

版本升級,也分爲兩種處理方式:.net

(1)跳轉到App某市場(例如:360手機助手),而後根據包名在市場定位到該App,經過市場下載更新安裝。教程

(2)在本App中實現Apk下載,下載完成後更新安裝。生命週期

本篇博客的內容將圍繞如何實現Apk下載,下載完成後更新安裝來展開。rem

下面我將內容大體分爲如下幾個部分:get

(1)App版本檢測博客

(2)Apk下載

(3)Apk更新安裝

(4)對以上功能進行封裝

基於以上4部分,咱們逐一展開。

1.App版本檢測:

要實現App的更新下載,咱們上面介紹了,前提是服務器要保存一個App的版本號(一般的方式是保存versionCode,固然你要對比versionName也不要緊)。當用戶去手動檢測版本,或者進入首頁自動檢測時,第一步是須要請求服務器的版本號,拿到版本號以後與當前App版本號(當前版本號可經過PackageInfo獲取)進行對比。服務器返回的版本號大於當前App版本號,證實App已經有更新,那麼進入第2步。

2.Apk下載

Apk文件是保存在服務器的。咱們能夠經過Http流將其下載到本地手機,而後更新安裝。Android中下載的方式不少種:HttpUrlConnection,Retrofit,okHttp,以及android原生的下載工具類DownLoadManager 等等。咱們採用的方式是Google推薦的下載工具類DownLoadManager。關於DownLoadManager的使用其實很簡單,簡單歸納以下:

(1)經過getSystemService獲取DownLoadManager。

(2)初始化DownLoadManager的Request,構建下載請求。

(3)調用DownLoadManager的enqueue異步發起請求,該方法返回值爲標識當前下載任務的id,即downloadId。

(4)當下載完成後,系統會發出條件爲android.intent.action.DOWNLOAD_COMPLETE的廣播,咱們能夠自定義廣播接受器,而後在onReceive中處理下載完成的邏輯便可。

詳細使用方式你們能夠參考網上的教程,此處就再也不贅述。

上面經過下載囉嗦了一堆。此時咱們要想一個問題:當咱們下載完成後,並無安裝。當用戶再次進入App時該如何操做?

有朋友會說,那就再去下載一次,而後繼續執行更新安裝呀!哈哈,這種方式是沒有錯誤的,可是若是用戶惡意行爲,每次下載完成都不安裝,那咱們豈不是每次都要去下載100次,1000次。。(而後手機boom!!!)這種方式確定是不能採用的。那麼咱們該如何解決呢?

很簡單,當咱們在下載以前,先去指定的文件夾下查看有木有已經下載好的Apk,而且該Apk的版本是高於本App的版本,此時咱們就去執行安裝操做。若是上面條件不成立,此時再去執行下載操做。

3.Apk更新安裝

相信你們對於如何安裝一個Apk都比較熟悉吧,原理也是比較簡單的。

(1)經過downloadId獲取下載的Uri。

(2)將Uri設置到Itent的setDataAndType做爲啓動條件。

(3)調用startActivity啓動對應Intent便可。

以上3步,便可完成App的更新功能。

總體的流程很清晰:

版本檢測 → Apk下載 (檢查是否存在未安裝的Apk) → Apk安裝 → 完成更新

下面,經過代碼來具體分析整個流程:

關於App版本檢測其實就是一個Http請求,再也不多說。咱們從Apk下載開始:

上面咱們提到,在下載以前須要去檢測是否存在已經下載的Apk。經過什麼獲取呢?沒錯,確定是downloadId了。

1> 若是存在downloadId,那麼咱們經過downloadId獲取當前下載的狀態status。status分爲成功,失敗兩種狀態。

(1)當status爲成功狀態時,即已經下載完成,咱們就經過downloadId獲取下載文件的Uri。而後能夠經過Uri獲取PackageInfo,與當前App進行包名和版本號的對比,當包名相同,而且當前版本號是小於下載的Apk版本號兩個條件同時成立時,直接執行安裝操做。不然,執行remove,經過downloadId刪除下載任務以及文件,繼續執行下載。

(2)當status爲失敗狀態時,即下載未完成,咱們就直接執行從新下載便可。

2> 若是不存在downloadId,即沒有下載過Apk,執行下載便可。

核心代碼以下:

下載完成後,系統會發出廣播,在廣播中,咱們對比downloadId是否相同,相同狀況下,直接經過downloadId獲取Uri,而後跳轉到安裝界面,提示用戶安裝便可:

因此,別忘了在下載以前要先將該大喇叭(廣播接受器)註冊。

最後,當咱們安裝完成後,再次進入App,就將其已下載的Apk文件進行刪除(將該方法放在onCreate生命週期中便可):

上面經過downloadApk獲取下載文件的地址。downloadApk地址是在下載完成後廣播接收器中保存的。

經過上面的步驟,咱們就完成了App更新下載安裝的所有工做。相信你們也有了更深的認識和理解。

本篇博客的內容就到此爲止了,有問題的朋友能夠留言給我

相關文章
相關標籤/搜索