感謝作者shelwee,本項目是基於UpdateHelper項目,並參考了友盟自動更新SDK的應用交互方式而開發的一個支持自定義接口的自動更新類庫。
簡介
應用內更新,實現類似友盟自動更新sdk的更新模式,用戶使用前只需要配置自己的服務器更新檢查接口即可(必須接口),也可以拓展加入一個接口作爲在線參數配置來實現(可選接口)可實現以下四種方式更新和是否強制更新組合使用,支持get、post方式請求網絡,默認是使用get方式,支持接口返回數據自定義解析。
項目地址:http://www.github.com/jjdxmashl/jjdxm_update
簡書地址:http://www.jianshu.com/p/843f7cee4f46
更新檢查
1.手動更新:手動檢測更新(所有網絡類型環境檢測並提示主要用於點擊檢測使用)
2.自動更新:自動檢測更新(所有網絡類型環境檢測並提示)
3.僅WiFi自動檢測更新(只有WiFi網絡類型環境檢測並提示)
4.靜默更新:僅WiFi自動檢測下載(只有WiFi網絡類型環境檢測、下載完才提示)
強制更新
強制更新(配合在線參數使得當前版本無法使用)結合以上幾種方式組合使用,主要使用場景是當上一個版本的APP有重大bug或漏洞時,修改在線參數統一控制所有的APP用戶,使得之前的所有版本必須要升級才能正常使用。主要原理:服務器上修改參數的數值,APP端獲取後進行判斷,如果爲強制更新,則在打開應用是提示有新版APP更新,更新完成才能使用,提示框不消失,用戶如果選擇不更新則退出應用。
特性
1.更新數據接口用戶可自定義
2.在線參數接口用戶可自定義
3.參數結構返回可以讓用戶自定義解析
截圖
demo下載
代碼混淆
根據你的混淆器配置和使用,您可能需要在你的proguard文件內配置以下內容:
後續加上
快速開始
step1:
依賴本項目類庫
該項目已經打包到jcenter中心了,可以通過compile命令直接依賴,在主程序目錄build.gradle中,添加以下代碼:
compile 'com.dou361.update-update:1.0.3'
step2:
需要權限
<!--jjdxm_update更新 start-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--jjdxm_update更新 end-->
清單文件中需要配置一個activity和一個服務
<!--jjdxm_update更新 start-->
<activity
android:name="com.dou361.update.view.UpdateDialogActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
</activity>
<service android:name="com.dou361.update.server.DownloadingService"/>
<!--jjdxm_update更新 end-->
step3:
在Application中配置,初始化配置接口和解析參數
這裏必須配置一個在線更新接口及其的數據返回結構的解析,可選的是在線參數接口及其數據返回結構的解析,在線參數可以隨機定義零個或多個不同意義的參數來達到在線修改apk的部分特性。
(1)創建一個自動更新的配置文件
public class UpdateConfig {
private static String checkUrl = "你的更新接口";
private static String onlineUrl = "你的在線參數接口";
public static void init(Context context) {
UpdateHelper.init(context);
UpdateHelper.getInstance()
// 必填:數據更新接口
.setCheckUrl(checkUrl)
// 可填:在線參數接口
.setOnlineUrl(onlineUrl)
// 必填:用於從數據更新接口獲取的數據response中。解析出Update實例。以便框架內部處理
.setCheckJsonParser(new ParseData() {
@Override
public Update parse(String response) {
return null;
}
})
// 可填:在線參數接口
.setOnlineJsonParser(new ParseData() {
@Override
public String parse(String httpResponse) {
return null;
}
});
}
}
(2)配置接口和解析數據,UpdateConfig文件中的,get請求,默認爲get請求
private static String checkUrl = "你的更新接口";
private static String onlineUrl = "你的在線參數接口";
public static void init(Context context) {
UpdateHelper.init(context);
UpdateHelper.getInstance()
// 必填:數據更新接口
.setCheckUrl(checkUrl)
// 可填:在線參數接口
.setOnlineUrl(onlineUrl)
// 必填:用於從數據更新接口獲取的數據response中。解析出Update實例。以便框架內部處理
.setCheckJsonParser(new ParseData() {
@Override
public Update parse(String response) {
// 此處模擬一個Update對象
Update update = new Update();
// 此apk包的下載地址
update.setUpdateUrl(apkFile);
// 此apk包的版本號
update.setVersionCode(2);
update.setApkSize(12400000);
// 此apk包的版本名稱
update.setVersionName("2.0");
// 此apk包的更新內容
update.setUpdateContent("測試更新");
// 此apk包是否爲強制更新
UpdateSP.setForced(false);
return update;
}
})
// 可填:在線參數接口
.setOnlineJsonParser(new ParseData() {
@Override
public String parse(String httpResponse) {
return null;
}
});
}
post請求
private static String checkUrl = "你的更新接口";
private static String onlineUrl = "你的在線參數接口";
public static void init(Context context) {
UpdateHelper.init(context);
TreeMap<String, Object> params = new TreeMap<String, Object>();
params.put("pkname", "com.jingwang.eluxue_online");
params.put("Action", "Apps");
params.put("SecretId", "d021e4f5tac98U4df5Nb943Odd3a313d9f68");
params.put("Region", "gz");
params.put("Nonce", Integer.valueOf((new Random()).nextInt(2147483647)));
params.put("Timestamp", Long.valueOf(System.currentTimeMillis() / 1000L));
params.put("RequestClient", "SDK_JAVA_1.0");
try {
params.put("Signature", Sign.sign(Sign.makeSignPlainText(params, "POST"), "FDC9BC1AA4B387CEBBF0F9355CEC2086"));
} catch (Exception var9) {
var9.printStackTrace();
}
UpdateHelper.getInstance()
// 可填:請求方式
.setMethod(UpdateHelper.RequestType.post)
// 必填:數據更新接口
.setCheckUrl(checkUrl, params)
// 可填:在線參數接口
.setOnlineUrl(onlineUrl)
// 必填:用於從數據更新接口獲取的數據response中。解析出Update實例。以便框架內部處理
.setCheckJsonParser(new ParseData() {
@Override
public Update parse(String response) {
// 此處模擬一個Update對象
Update update = new Update();
try {
JSONObject jobj = new JSONObject(response);
if (!jobj.isNull("data")) {
JSONObject job = jobj.optJSONObject("data");
if (!job.isNull("v_code")) {
// 此apk包的版本號
update.setVersionCode(Integer.valueOf(job.optString("v_code")));
}
if (!job.isNull("v_size")) {
// 此apk包的大小
update.setApkSize(job.optLong("v_size"));
}
if (!job.isNull("v_name")) {
// 此apk包的版本名稱
update.setVersionName(job.optString("v_name"));
}
if (!job.isNull("update_content")) {
// 此apk包的更新內容
update.setUpdateContent(job.optString("update_content"));
}
if (!job.isNull("download_url")) {
// 此apk包的下載地址
update.setUpdateUrl(job.optString("download_url"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
// 此apk包是否爲強制更新
UpdateSP.setForced(false);
return update;
}
})
// 可填:在線參數接口
.setOnlineJsonParser(new ParseData() {
@Override
public String parse(String httpResponse) {
return null;
}
});
}
(3)在Application的oncreate方法中調用進行sdk的初始化
UpdateConfig.init(this);
step4:
在mainActivity中oncreate()方法中調用
//默認是自動檢測更新
UpdateHelper.getInstance()
.check(MainActivity.this);
step5:
在需要手動點擊的方法中調用
//手動檢測更新
UpdateHelper.getInstance()
.setUpdateType(UpdateHelper.UpdateType.checkupdate)
.setUpdateListener(new UpdateListener() {
@Override
public void noUpdate() {
Toast.makeText(mContext, "已經是最新版本了", Toast.LENGTH_LONG).show();
}
@Override
public void onCheckError(int code, String errorMsg) {
Toast.makeText(mContext, "檢測更新失敗:" + errorMsg, Toast.LENGTH_LONG).show();
}
})
.check(MainActivity.this);
幾種方式的調用
//有網更新
UpdateHelper.UpdateType.checkupdate,
//自動更新
UpdateHelper.UpdateType.autoupdate,
//只有WiFi更新
UpdateHelper.UpdateType.autowifiupdate,
//只有WiFi下載
UpdateHelper.UpdateType.autowifidown
調用方式這裏只舉例靜默更新,其他方式類似
/靜默更新
UpdateHelper.getInstance()
.setUpdateType(UpdateHelper.UpdateType.autowifidown)
.check(MainActivity.this);
更新監聽回調UpdateListener,主要有四個方法
/**
* There are a new version of APK on network
*/
public void hasUpdate(Update update) {
}
/**
* There are no new version for update
*/
public abstract void noUpdate();
/**
* http check error,
*
* @param code http code
* @param errorMsg http error msg
*/
public abstract void onCheckError(int code, String errorMsg);
/**
* to be invoked by user press cancel button.
*/
public void onUserCancel() {
}
項目地址:http://www.github.com/jjdxmashl/jjdxm_update
簡書地址:http://www.jianshu.com/p/843f7cee4f46