简单实现安卓自动更新
一般的安卓app都有自动更新功能,实现app的更新,以让用户体验新版本的功能,这里也是项目中用到的,今天就来总结一下,代码应该有点多,还请耐心点哈。
安卓应用实现自动更新比较简单,这里跟大家介绍下:
第一步 服务器端:
服务端提供一个借口,或者网址,我这里就用的服务器是tomcat,这里提供一个网址如下:
//也就是一个json数据接口
public static final String UPDATE_URL = "http://192.168.1.103:8080/update.json";
我们来看下json数据参数:
{
//app名字
appname: "爱新闻1.1",
//服务器版本号
serverVersion: "2",
//服务器标志
serverFlag: "1",
//是否强制更新
lastForce: "1",
//apk下载地址,这里我已经下载了官方的apk,放到了服务器里面
updateurl: "http://192.168.1.103:8080/36Kr.apk",
//版本的更新的描述
upgradeinfo: "V1.1版本更新,你想不想要试一下哈!!!"
}
好了以上的是服务器端的信息,在这里不需要多说了,我们来看下客户端的吧。
第二步 客户端需要实现:
首先我们要去解析服务端给的json,那么我们就要来创建一个model类了(代码过多,这里只有字段,getter和setter方法自己创建):
//app名字
private String appname;
//服务器版本
private String serverVersion;
//服务器标志
private String serverFlag;
//强制升级
private String lastForce;
//app最新版本地址
private String updateurl;
//升级信息
private String upgradeinfo;
在这里使用了一个辅助类,基本和model字段差不多:
public class UpdateInformation {
public static String appname = MyApplication.getInstance()
.getResources().getString(R.string.app_name);
public static int localVersion = 1;// 本地版本
public static String versionName = ""; // 本地版本名
public static int serverVersion = 1;// 服务器版本
public static int serverFlag = 0;// 服务器标志
public static int lastForce = 0;// 之前强制升级版本
public static String updateurl = "";// 升级包获取地址
public static String upgradeinfo = "";// 升级信息
public static String downloadDir = "wuyinlei";// 下载目录
}
我们知道,我们在进入app的时候,这个时候如果检测到服务器端有了新的版本,就回弹出提示框,提示我们更新。这个我们在MainActivity里面处理逻辑(onCreate()方法里面):
OkhttpManager.getAsync(Config.UPDATE_URL, new OkhttpManager.DataCallBack() {
@Override
public void requestFailure(Request request, Exception e) {
}
@Override
public void requestSuccess(String result) {
try {
Log.d("wuyiunlei",result);
JSONObject object = new JSONObject(result);
UpdateInfoModel model = new UpdateInfoModel();
model.setAppname(object.getString("appname"));
model.setLastForce(object.getString("lastForce"));
model.setServerFlag(object.getString("serverFlag"));
model.setServerVersion(object.getString("serverVersion"));
model.setUpdateurl(object.getString("updateurl"));
model.setUpgradeinfo(object.getString("upgradeinfo"));
tmpMap.put(DeliverConsts.KEY_APP_UPDATE, model);
} catch (JSONException e) {
e.printStackTrace();
}
//发送广播
sendBroadcast(new Intent(UpdateReceiver.UPDATE_ACTION));
}
});
当然了,我们也要注册和结束广播:
/**
* 广播注册
*/
private void registerBroadcast() {
mUpdateReceiver = new UpdateReceiver(false);
mIntentFilter = new IntentFilter(UpdateReceiver.UPDATE_ACTION);
this.registerReceiver(mUpdateReceiver, mIntentFilter);
}
/**
* 广播卸载
*/
private void unRegisterBroadcast() {
try {
this.unregisterReceiver(mUpdateReceiver);
} catch (Exception e) {
e.printStackTrace();
}
}
好了,接下来我们看下我们自定义的广播接收者UpdateReceiver .java:
/**
* 版本更新升级 广播接受者
*
*/
public class UpdateReceiver extends BroadcastReceiver {
private AlertDialog.Builder mDialog;
public static final String UPDATE_ACTION = "wuyinlei_aixinwen";
private SharedPreferencesHelper mSharedPreferencesHelper;
private boolean isShowDialog;
public UpdateReceiver() {
}
public UpdateReceiver(boolean isShowDialog) {
super();
this.isShowDialog = isShowDialog;
}
@Override
public void onReceive(Context context, Intent intent) {
mSharedPreferencesHelper = mSharedPreferencesHelper
.getInstance(MyApplication.getInstance());
//当然了,这里也可以直接new处hashmap
HashMap tempMap = MyApplication.getInstance()
.getTempMap();
UpdateInfoModel m