一、配置文件:
update_version.json
[{"appname":"myapp","apkname":"myapp.apk","verName":1.0,"verCode":1}]
版本的比较,是根据update_version.json中的verCode 以及apk文件中AndroidManifest.xml文件中的定义的版本号:
android:versionCode="1" android:versionName="1.0"
二、初始化时比较版本
//比较服务器版本//在 onCreate函数中调用 if (getServerVerCode()) { int vercode = Config.getVerCode(this); if (newVerCode > vercode) { doNewVersionUpdate();//发现新版本更新 } else { Toast.makeText(getApplicationContext(),"目前是最新版本,感谢您的支持",Toast.LENGTH_LONG).show();//没有新版本 } }//子函数,获取版本号 private boolean getServerVerCode() { try { //取得服务器地址和接口文件名 String verjson = NetworkTool.getContent(Config.UPDATE_SERVER + Config.UPDATE_VERJSON); JSONArray array = new JSONArray(verjson); if (array.length() > 0) { JSONObject obj = array.getJSONObject(0); try { newVerCode = Integer.parseInt(obj.getString("verCode")); newVerName = obj.getString("verName"); } catch (Exception e) { newVerCode = -1; newVerName = ""; return false; } } } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } return true; } //子函数,若是有新版本,则 private void doNewVersionUpdate() { int verCode = Config.getVerCode(this); String verName = Config.getVerName(this); StringBuffer sb = new StringBuffer(); sb.append("当前版本:"); sb.append(verName); sb.append(" Code:"); sb.append(verCode); sb.append(", 发现新版本"); sb.append(newVerName); sb.append(" Code:"); sb.append(newVerCode); sb.append(",是否更新?"); Dialog dialog = new AlertDialog.Builder(UpdateActivity.this) .setTitle("软件更新") .setMessage(sb.toString()) // 设置内容 .setPositiveButton("更新",// 设置确定按钮 new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { pBar = new ProgressDialog(UpdateActivity.this); pBar.setTitle("正在下载"); pBar.setMessage("请稍候..."); pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME); } }) .setNegativeButton("暂不更新", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // 点击"取消"按钮之后退出程序 finish(); } }).create();//创建 // 显示对话框 dialog.show(); }
三、下载并升级
void downFile(final String url) { pBar.show(); new Thread() { public void run() { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response; try { response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); FileOutputStream fileOutputStream = null; if (is != null) { File file = new File( Environment.getExternalStorageDirectory(), Config.UPDATE_SAVENAME); fileOutputStream = new FileOutputStream(file); byte[] buf = new byte[1024]; int ch = -1; int count = 0; while ((ch = is.read(buf)) != -1) { fileOutputStream.write(buf, 0, ch); count += ch; if (length > 0) { } } } fileOutputStream.flush(); if (fileOutputStream != null) { fileOutputStream.close(); } down(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } void down() { handler.post(new Runnable() { public void run() { pBar.cancel(); update(); } }); } void update() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment .getExternalStorageDirectory(), Config.UPDATE_SAVENAME)), "application/vnd.android.package-archive"); startActivity(intent); }
还有一些细节,没有说出来~
相关文献参考:
http://blog.csdn.net/xjanker2/article/details/6303937
http://blog.csdn.net/muyu114/article/details/6623509
http://blog.csdn.net/w200221626/article/details/6690769
本文转载自:http://www.cnblogs.com/Amandaliu/archive/2011/08/22/2148936.html
Config.java
package Sys.ext; import Sys.activity.R; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.util.Log; public class Config { private static final String TAG="Config"; public static final String UPDATE_SERVER = "http://10.20.147.117/jtapp12/"; public static final String UPDATE_APKNAME = "jtapp-12-updateapksamples.apk"; public static final String UPDATE_VERJSON = "ver.json"; public static final String UPDATE_SAVENAME = "updateapksamples.apk"; /** * get version number * @param context * @return */ public static int getVerCode(Context context){ int verCode=-1; try { verCode=context.getPackageManager().getPackageInfo("Sys.activity", 0).versionCode; } catch (NameNotFoundException e) { // TODO: handle exception Log.e(TAG, e.getMessage()); } return verCode; } /** * get version number * @param context * @return */ public static String getVerName(Context context){ String verName=""; try { verName=context.getPackageManager().getPackageInfo("Sys.activity", 0).versionName; } catch (NameNotFoundException e) { // TODO: handle exception Log.e(TAG, e.getMessage()); } return verName; } /** * get apkname * @param context * @return */ public static String getAppName(Context context){ String verName=context.getResources().getText(R.string.app_name).toString(); return verName; } }
NetworkTool.java
package Sys.ext; import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; public class NetworkTool { public static String getContent(String url) throws Exception{ StringBuilder sb=new StringBuilder(); HttpClient client=new DefaultHttpClient(); HttpParams httpParams=client.getParams(); //设置网络超时参数 HttpConnectionParams.setConnectionTimeout(httpParams, 3000); HttpConnectionParams.setSoTimeout(httpParams, 5000); HttpResponse response=client.execute(new HttpGet(url)); HttpEntity entity=response.getEntity(); if (entity!=null) { BufferedReader reader=new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"),8192); String line=null; while((line=reader.readLine())!=null){ sb.append(line+"\n"); } reader.close(); } return sb.toString(); } }
UpdateActivity.java
package Sys.activity; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONObject; import Sys.ext.Config; import Sys.ext.NetworkTool; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.util.Log; public class UpdateActivity extends Activity{ private static final String TAG="Update"; public ProgressDialog pBar; private Handler handler=new Handler(); private int newVerCode=0; private String newVerName=""; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); if (getServerVerCode()) { int vercode=Config.getVerCode(this); if (newVerCode>vercode) { doNewVersionUpdate(); }else { notNewVersionShow(); } } } private boolean getServerVerCode() { try { String verjson = NetworkTool.getContent(Config.UPDATE_SERVER + Config.UPDATE_VERJSON); JSONArray array = new JSONArray(verjson); if (array.length() > 0) { JSONObject obj = array.getJSONObject(0); try { newVerCode = Integer.parseInt(obj.getString("verCode")); newVerName = obj.getString("verName"); } catch (Exception e) { newVerCode = -1; newVerName = ""; return false; } } } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } return true; } private void notNewVersionShow() { int verCode = Config.getVerCode(this); String verName = Config.getVerName(this); StringBuffer sb = new StringBuffer(); sb.append("当前版本:"); sb.append(verName); sb.append(" Code:"); sb.append(verCode); sb.append(",/n已是最新版,无需更新!"); Dialog dialog = new AlertDialog.Builder(UpdateActivity.this).setTitle("软件更新") .setMessage(sb.toString())// 设置内容 .setPositiveButton("确定",// 设置确定按钮 new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }).create();// 创建 // 显示对话框 dialog.show(); } private void doNewVersionUpdate() { int verCode = Config.getVerCode(this); String verName = Config.getVerName(this); StringBuffer sb = new StringBuffer(); sb.append("当前版本:"); sb.append(verName); sb.append(" Code:"); sb.append(verCode); sb.append(", 发现新版本:"); sb.append(newVerName); sb.append(" Code:"); sb.append(newVerCode); sb.append(", 是否更新?"); Dialog dialog = new AlertDialog.Builder(UpdateActivity.this) .setTitle("软件更新") .setMessage(sb.toString()) // 设置内容 .setPositiveButton("更新",// 设置确定按钮 new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { pBar = new ProgressDialog(UpdateActivity.this); pBar.setTitle("正在下载"); pBar.setMessage("请稍候..."); pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME); } }) .setNegativeButton("暂不更新", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // 点击"取消"按钮之后退出程序 finish(); } }).create();// 创建 // 显示对话框 dialog.show(); } void downFile(final String url) { pBar.show(); new Thread() { public void run() { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response; try { response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); FileOutputStream fileOutputStream = null; if (is != null) { File file = new File( Environment.getExternalStorageDirectory(), Config.UPDATE_SAVENAME); fileOutputStream = new FileOutputStream(file); byte[] buf = new byte[1024]; int ch = -1; int count = 0; while ((ch = is.read(buf)) != -1) { fileOutputStream.write(buf, 0, ch); count += ch; if (length > 0) { } } } fileOutputStream.flush(); if (fileOutputStream != null) { fileOutputStream.close(); } down(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } void down() { handler.post(new Runnable() { public void run() { pBar.cancel(); update(); } }); } void update() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment .getExternalStorageDirectory(), Config.UPDATE_SAVENAME)), "application/vnd.android.package-archive"); startActivity(intent); } }