现在android开发,一般采用的是CS模式,那么apk的升级,自然而然需要有server端的支持。一般,我们将升级版本以及一个记录升级版本的配置文件(在本文中采用jsonarray格式)放在server端。当Client初始化时,如果检测到server端有更新的版本(读取server的配置文件),则将在server端的升级版本以Http的方式连接,将其下载下来,然后调用android的api进行替换升级。

一、配置文件:

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 exceptionLog.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 exceptionLog.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="";@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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() {@Overridepublic 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() {@Overridepublic 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);    }}


更多相关文章

  1. android G1蓝牙与无线网络,APN接入点设置
  2. Android(安卓)Studio导入指定的jar包
  3. . Android內核Porting相關背景知識
  4. Android(安卓)利用Fiddler进行网络数据抓包
  5. Android(安卓)自定义控件基础
  6. Android设置Alpha值实现图片渐变效果
  7. Android小项目之四 自动更新检查的逻辑
  8. android 对话框弹出位置和透明度的设置
  9. Android(安卓)获取应用的安装时间及更新时间

随机推荐

  1. 隐藏菜单APP显示图标
  2. android init.rc增加一个自定义的service
  3. Installation error: INSTALL_FAILED_INS
  4. Android(安卓)Studio打包设置分支
  5. android网络图片的下载
  6. android前台渲染图片
  7. Android图形报表之AchartEngine(附开发包
  8. Android中循环的几种方式
  9. Android平台mass storage相关代码
  10. Android中Timer使用示例