Android應用如何做到自動更新

ddsju 8年前發布 | 28K 次閱讀 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


 

 本文由用戶 ddsju 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!