Android應用如何做到自動更新
來自: http://www.jcodecraeer.com//a/anzhuokaifa/androidkaifa/2014/0304/1585.html
一般app應用商店中提供了安卓軟件的升級功能,但是很多app都在第三方商店升級之外增加了自己的升級方式。這是如何做到的呢?
“這是如何做到的呢?”這個問題是我們在搞android開發的時候容易進入誤區的體現。其實拋開安卓這個概念,一個東西如果想更新版本其實都是一樣的。
1.需要比對版本,判斷是否需要更新。
2.如果有新版本出現則需要下載新版本。
3.新版本安裝或者保存在自己的設備中。
而在安卓中無非是圍繞如何實現這些步驟而已。
下面來談談實現的方法:
首先為了在任何地方都能比對版本,你必須要一個能提供最新版本信息的服務器,服務器的特定地址可以給出版本信息,一般都是web服務器。當然很多人不愿意為了更新版本就單獨做一個網站,你可以不用自己的服務器,而把這些信息放到互聯網的任何地方,只要能訪問得到就行,甚至博客中,app根據一定的規則解析到需要的信息。因為已經有自己的網站,所以就直接放在網站上面,這樣我可以在網站上集成發布app的功能。
版本比對信息中我會返回如下的信息,一般以json返回,方便客戶端解析。
json {"url":"http://192.168.1.115:8080/xxx.apk","versionCode":2,"updateMessage":"版本更新信息"}
第一個為該apk的下載地址,第二個為版本號,安卓應用中可以讀取當前的版本號和這個比較,如果當前應用版本號小于服務器說明有更新需要下載,第三個為更新說明。
而這三個信息其實是需要人工修改的,不是說你寫完一個app上面的信息就自動變了。但如果你有自己的網站的話,可以讓這個過程不那么痛苦,多花點時間在網站后臺寫個發布app的的功能。類似于下面這樣的:
將這些信息保存在一個文件中,或者數據庫中,然后在客戶端訪問版本信息的時候以json格式返回給客戶端。
下面再說說客戶端需要做的。
客戶端需要向提供版本信息的地址發起請求,得到{"url":"http://192.168.1.115:8080/xxx.apk","versionCode":2,"updateMessage":"版本更新信息"}的json字符串。(當然這是通過開啟一個線程來做的)
然后解析該字符串:
try { JSONObject obj = new JSONObject(json); String updateMessage = obj.getString("updateMessage"); String apkUrl = obj.getString("url"); int apkCode = obj.getInt("versionCode"); int versionCode = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode; if (apkCode > versionCode) { //下載apk } else { Toast.makeText(mContext, mContext.getString(R.string.app_no_new_update), Toast.LENGTH_SHORT).show(); } } catch (PackageManager.NameNotFoundException ignored) { } catch (JSONException e) { Log.e(TAG, "parse json error", e); }
如果服務端版本號大于app中的版本號,則下載apk(int versionCode = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode;
可獲得版本號)。
下載最好開啟一個service來完成。
下載apk的過程很簡單:
String urlStr = intent.getStringExtra(Constants.APK_DOWNLOAD_URL); InputStream in=null; FileOutputStream out = null; try { URL url = new URL(urlStr); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(false); urlConnection.setConnectTimeout(10 * 1000); urlConnection.setReadTimeout(10 * 1000); urlConnection.setRequestProperty("Connection", "Keep-Alive"); urlConnection.setRequestProperty("Charset", "UTF-8"); urlConnection.setRequestProperty("Accept-Encoding", "gzip, deflate"); urlConnection.connect(); long bytetotal = urlConnection.getContentLength(); long bytesum = 0; int byteread = 0; in = urlConnection.getInputStream(); File dir = StorageUtils.getCacheDirectory(this); String apkName=urlStr.substring(urlStr.lastIndexOf("/")+1, urlStr.length()); File apkFile = new File(dir, apkName); out = new FileOutputStream(apkFile); byte[] buffer = new byte[BUFFER_SIZE]; int oldProgress = 0; while ((byteread = in.read(buffer)) != -1) { bytesum += byteread; out.write(buffer, 0, byteread); }
下載完成我們需要通知用戶,這可以通過安卓消息欄的方式,也可以通過彈出對話框的方式。第一種方式是通過NotificationManager,第二種可以發送廣播來通知客戶端。
其實在github上已經有了一個比較完整的第三方庫來實現app的更新,調用只需一句代碼就可以搞定,不足之處是他將請求版本信息的地址放在了庫文件的一個變量中,不能直接在外部傳遞。https://github.com/feicien/android-auto-update