Android App 版本自動更新庫:AnyVersion

jopen 9年前發布 | 55K 次閱讀 Android開發 移動開發 AnyVersion

Android App 版本更新提示庫 - An Android APP new version update library.

## 1. 基本使用教程

### Step 1 - 依賴

AnyVersion 最新版本已推送到 Maven Central 和 JCenter 兩個服務中。請查看項目根`build.gradle`文件配置信息中是否存在 **jcenter** 或者 **mavenCentral** 選項。如果沒有,請添加。

allprojects {
    repositories {
        jcenter()
        // OR: mavenCentral()
    }
}

然后,在 Android Studio 項目使用 AnyVersion 庫的模塊的 `build.gradle` 中添加如下依賴項:

dependencies {
... others ...
   compile 'com.github.yoojia:anyversion:1.0@aar'
}

### Step 2 - Android 權限

AnyVersion 需要的權限非常少,在 App 模塊的 `AndroidManifest.xml` 文件中添加以下內容:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

**注意:不要嵌套在 application 中,在它的外層。 **

### Step 3 - 初始化

AnyVersion 被設計成一個單例。因此,每個 App 中只允許存在一個 AnyVersion 實例。建議在自定義 Application 類的 `onCreate(...)` 方法中初始化 AnyVersion 單例。

例如:

public class AnyVersionApplication extends Application {
   @Override
   public void onCreate() {
       super.onCreate();
       AnyVersion.init(this, new VersionParser() {
           @Override
           public Version onParse(String response) {
               final JSONTokener tokener = new JSONTokener(response);
               try {
                   JSONObject json = (JSONObject) tokener.nextValue();
                   return new Version(
                           json.getString("name"),
                           json.getString("note"),
                           json.getString("url"),
                           json.getInt("code")
                   );
               } catch (JSONException e) {
                   e.printStackTrace();
               }
               return null;
           }
       });
   }
}

這樣可以保證 AnyVersion 只初始化一次。如果初始化多次,AnyVersion 只使用首次初始化的 `VersionParser` 接口。其它的初始化操作將會被忽略。

#### - 設置檢查新版本 API 的 URL

AnyVersion 允許改變檢查新版本 API 的 URL 地址。在初始化 AnyVersion 單例后,需要設置檢查新版本的 URL 地址。

AnyVersion version = AnyVersion.getInstance();
version.setURL("http://192.168.1.2:8082/android/release.json");

AnyVersion 內置了 HTTP 請求,可以獲取此 URL 的響應數據,交由 `VersionParser` 接口解析。

#### - VersionParser 版本數據解析接口

由于每個項目需求不同,服務端返回的數據格式也不同。因此,需要實現 `VersionParser` 接口來將不同的服務端響應數據解析成 `Vesion` 對象。

new Parser() { 
@Override public Version onParse(String response) {
return 
new Version(versionName, versionNote, downloadURL, versionCode);
   }
}

接口的實現類,需要將 `onParse(response)` 回調方法中的的 response 字符串解析,獲取其中的 `versionName`,`versionNote`, `versionCode`,`downloadURL` 解析,并創建和返回 Version 對象。

### Step 4 - 檢查 APP 新版本

AnyVersion 提供了三種處理新版本的方式。 這三種方式基本滿足正常的應用需求。

* 彈出窗口 - **NotifyStyle.Dialog**
* 回調接口 - **NotifyStyle.Callback**
* 應用廣播 - **NotifyStyle.Broadcast**

通過`anyVerson.check(NotifyStyle)`接口來觸發檢查新版本。

AnyVersion version = AnyVersion.getInstance();
version.check(NotifyStyle);

#### - 彈出窗口 Dialog

AnyVersion 的彈出窗口提醒新版本方式,需要`android.permission.SYSTEM_ALERT_WINDOW` 權限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

當遠程服務器的版本(versionCode)大于當前應用的版本數時,AnyVersion 將彈出一個對話框讓用戶選擇是否升級。

#### - 回調接口 Callback

使用 Callback 可以自定義處理新版本的方式。在 `check(NotifyStyle)` 前,需要設置 Callback 接口的實現。

AnyVersion version = AnyVersion.getInstance();
    version.setCallback(new Callback() {
        @Override
        public void onVersion(Version version) {
            Log.d("AnyVersion","New Version: \n" + version);
        }
    });

**注意:僅當 NotifyStule.Callback 時,此 Callback 接口才會被回調。**

#### - 應用廣播 Broadcast

使用 Broadcast 來處理新版本,這種方式很不尋常,不過仍然存在。
AnyVersion 限制了接收廣播的 Receiver 類型必須為 `VersionReceiver` 子類,此舉是為少 AnyVersion 的復雜度。

class NewVersionReceiver extends VersionReceiver{
        @Override
        protected void onVersion(Version newVersion) {
            System.out.println(">> Broadcast === \n" + newVersion);
        }
    }

Android 的廣播機制,建議用戶在 Activity.onStart() 中注冊 Receiver,在 Activity.onStop() 中移除。AnyVersion 提供了注冊和反注冊的方法。

@Override
    protected void onStart() {
        super.onStart();
        AnyVersion.registerReceiver(this, newVersionReceiver);
    }
    @Override
    protected void onStop() {
        super.onStop();
        AnyVersion.unregisterReceiver(this, newVersionReceiver);
    }

### Step 5 - 自動安裝 App

當 App 用戶同意更新,并且應用下載完成后,AnyVersion 會檢查下載文件是否為 APK 文件。如果是 APK 文件,則自動調用系統的安裝程序,完全自動更新 App 任務。

## 2. TODO

1. 根據網絡類型,優化彈出窗口的選項類型
2. App 資源增量更新功能
3. 通知欄提醒新版本方式

## 3. 案例

* 停車** 

## 版權聲明

如果你的App中使用了 AnyVersion 庫,你可以通過電子郵件通知我 Yoojia.Chen@gmail.com ,如下格式:

> 主題: 使用 AnyVersion 通知

> 內容: 我在 (_YOUR-APP-NAME_) 中使用了 AnyVersion-{_lib-version_}。我[同意|不同意]在GitHub AnyVersion 的`案例`中顯示我的應用信息。

項目主頁:http://www.baiduhome.net/lib/view/home/1420633061578

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