纵观现在的好多Android应用程序,应用本身都有检查更新的的功能,不用去应用市场下载更新。
今天来实现这个功能:(需要服务器的配合)
Demo的布局文件很简单:一个Button叫做“检查更新”。
java代码:
button的监听事件:(下面的代码在onCreate中就行)
ll_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
checkUpdate();
}
});
下面的nowVersion是获取你手机应用当前的版本名称:也是在onCreate方法中就行
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
nowVersion = packageInfo.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
下面是检查服务器的apk的版本名称:
/**
* 下载更新,
*/
protected void checkUpdate() {
proDialogShow(LoginActivity.this, "正在查询...");
RequestParams params = new RequestParams("url");//这个就是上面说的需要服务器配合的地方,需要服务器给一个接口,请求返回的字符串要包含新APK文件的版本名称,这样我们就可以跟当前的apk名称对比是否要更新
x.http().get(params, new Callback.CommonCallback() {
@Override
public void onCancelled(CancelledException arg0) {
}
@Override
public void onError(Throwable arg0, boolean arg1) {
PDialogHide();
System.out.println("提示网络错误");
}
@Override
public void onFinished() {
}
@Override
public void onSuccess(String arg0) {
PDialogHide();
try {
JSONObject object = new JSONObject(arg0);
boolean success = object.getBoolean("succee");
if (success) {
String desc = object.getString("desc");//版本描述
String downloadurl = object.getString("downloadurl");//新版本更新地址
String versionname = object.getString("versionname");//新版本名称
if (nowVersion.equals(versionname)) {
System.out.println("当前版本为最新,不用跟新");
} else {
// 不同,弹出更新提示对话框
setUpDialog(versionname, downloadurl, desc);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
对话框提示下载的版本以及版本描述代码:
/**
*
* @param versionname
* 地址中版本的名字
* @param downloadurl
* 下载包的地址
* @param desc
* 版本的描述
*/
protected void setUpDialog(String versionname, final String downloadurl,
String desc) {
AlertDialog dialog = new AlertDialog.Builder(this).setCancelable(false)
.setTitle("下载" + versionname + "版本").setMessage(desc)
.setNegativeButton("取消", null)
.setPositiveButton("下载", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
setDownLoad(downloadurl);
}
}).create();
dialog.show();
}
下面是正式的下载apk文件:(有些变量就自己定义一下)
/**
* 下载包
*
* @param downloadurl
* 下载的url
*
*/
@SuppressLint("SdCardPath")
protected void setDownLoad(String downloadurl) {
// TODO Auto-generated method stub
RequestParams params = new RequestParams(downloadurl);
params.setAutoRename(true);//断点下载
params.setSaveFilePath(Environment.getExternalStorageDirectory().getPath() + File.separator+"你好.apk");
x.http().get(params, new Callback.ProgressCallback() {
@Override
public void onCancelled(CancelledException arg0) {
// TODO Auto-generated method stub
}
@Override
public void onError(Throwable arg0, boolean arg1) {
// TODO Auto-generated method stub
if(progressDialog!=null && progressDialog.isShowing()){
progressDialog.dismiss();
}
System.out.println("提示更新失败");
}
@Override
public void onFinished() {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(File arg0) {
// TODO Auto-generated method stub
if(progressDialog!=null && progressDialog.isShowing()){
progressDialog.dismiss();
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), "你好.apk")),
"application/vnd.android.package-archive");
startActivity(intent);
}
@Override
public void onLoading(long total, long current, boolean isDownloading) {
// TODO Auto-generated method stub
progressDialog.setMax((int)total);
progressDialog.setProgress((int)current);
}
@Override
public void onStarted() {
// TODO Auto-generated method stub
System.out.println("开始下载");
progressDialog = new ProgressDialog(LoginActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置为水平进行条
progressDialog.setMessage("正在下载中...");
progressDialog.setProgress(0);
progressDialog.show();
}
@Override
public void onWaiting() {
// TODO Auto-generated method stub
}
});
}
两个辅助函数:
private void proDialogShow(Context context, String msg) {
pDialog = new ProgressDialog(context);
pDialog.setMessage(msg);
// pDialog.setCancelable(false);
pDialog.show();
}
private void PDialogHide() {
try {
if (pDialog != null && pDialog.isShowing()) {
pDialog.dismiss();
}
} catch (Exception e) {
e.printStackTrace();
}
}
基本流程就在上面。(流程很清晰,不应太依赖Demo,后续有时间整理的话在放出来)
会出现的问题:
1、dewnloadurl这个下载的地址是服务器给的,如果服务器的apk文件是中文命名的,会出现安装的时候:该"解析包出现错误";
说明下载文件出现了问题。我试过几次都是这个问题,到sd卡中查看发现,明明apk文件有10多兆,下载下来只有几十k,说明文件破坏了。我告诉服务器那边把apk名称改成英文,就好了。