標籤:點擊 執行 檔案 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版本自動更新