Android實現App版本自動更新

來源:互聯網
上載者:User

標籤:點擊   執行   檔案   net   receive   大於   並且   red   text   

現在很多的App中都會有一個檢查版本的功能。例如鬥魚TV App的設定介面下:

                 

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

(1)如果伺服器所返回的版本號碼大於當前App版本號碼那麼此時手機所安裝的App不是最新版。可以提示使用者升級。

(2)如果不大於目前的版本號,可以提示使用者為最新版本:

               

版本升級,也分為兩種處理方式:

(1)跳轉到App某市場(例如:360手機小幫手),然後根據包名在市場定位到該App,通過市場下載更新安裝。

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

本篇部落格的內容將圍繞如何?Apk下載,下載完成後更新安裝來展開。

下面我將內容大致分為以下幾個部分:

(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更新下載安裝的全部工作。相信大家也有了更深的認識和理解。

本篇部落格的內容就到此為止了,有問題的朋友可以留言給我。

源碼下載

Android實現App版本自動更新

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.