Android App 版本自動更新庫: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 的`案例`中顯示我的應用信息。