截图如下:

代码实现如下:

package com.update.apk;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;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.json.JSONArray;import org.json.JSONObject;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager.NameNotFoundException;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.util.Log;public class MainActivity extends Activity {    /** Called when the activity is first created. */    String newVerName = "";//新版本名称    int newVerCode = -1;//新版本号    ProgressDialog pd = null;    String UPDATE_SERVERAPK = "ApkUpdateAndroid.apk";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        if(getServerVer()){            int verCode = this.getVerCode(this);            if(newVerCode>verCode){                doNewVersionUpdate();//更新版本            }else{                notNewVersionUpdate();//提示已是最新版本            }        }    }        /**     * 获得版本号     */    public int getVerCode(Context context){        int verCode = -1;        try {            verCode = context.getPackageManager().getPackageInfo("com.update.apk", 0).versionCode;        } catch (NameNotFoundException e) {            // TODO Auto-generated catch block            Log.e("版本号获取异常", e.getMessage());        }        return verCode;    }        /**     * 获得版本名称     */    public String getVerName(Context context){        String verName = "";        try {            verName = context.getPackageManager().getPackageInfo("com.update.apk", 0).versionName;        } catch (NameNotFoundException e) {            Log.e("版本名称获取异常", e.getMessage());        }        return verName;    }        /**     * 从服务器端获得版本号与版本名称     * @return     */    public boolean getServerVer(){        try {            URL url = new URL("http://10.0.2.2:8080/ApkUpdateService/ver");            HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();            httpConnection.setDoInput(true);            httpConnection.setDoOutput(true);            httpConnection.setRequestMethod("GET");            httpConnection.connect();            InputStreamReader reader = new InputStreamReader(httpConnection.getInputStream());            BufferedReader bReader = new BufferedReader(reader);            String json = bReader.readLine();            JSONArray array = new JSONArray(json);            JSONObject jsonObj = array.getJSONObject(0);            newVerCode = Integer.parseInt(jsonObj.getString("verCode"));                    newVerName = jsonObj.getString("verName");        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();            return false;        }         return true;    }        /**     * 不更新版本     */    public void notNewVersionUpdate(){        int verCode = this.getVerCode(this);        String verName = this.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(this)        .setTitle("软件更新")        .setMessage(sb.toString())        .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        @Override            public void onClick(DialogInterface dialog, int which) {                // TODO Auto-generated method stub                finish();            }        }).create();        dialog.show();    }        /**     * 更新版本     */    public void doNewVersionUpdate(){        int verCode = this.getVerCode(this);        String verName = this.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(verCode);        sb.append(",是否更新");        Dialog dialog = new AlertDialog.Builder(this)        .setTitle("软件更新")        .setMessage(sb.toString())        .setPositiveButton("更新", new DialogInterface.OnClickListener() {                        @Override            public void onClick(DialogInterface dialog, int which) {                // TODO Auto-generated method stub                pd = new ProgressDialog(MainActivity.this);                pd.setTitle("正在下载");                pd.setMessage("请稍后。。。");                pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);                downFile("http://10.0.2.2:8080/ApkUpdateService/ApkUpdateAndroid.apk");            }        })        .setNegativeButton("暂不更新", new DialogInterface.OnClickListener() {                        @Override            public void onClick(DialogInterface dialog, int which) {                // TODO Auto-generated method stub                finish();            }        }).create();        //显示更新框        dialog.show();    }        /**     * 下载apk     */    public void downFile(final String url){        pd.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(),UPDATE_SERVERAPK);                        fileOutputStream = new FileOutputStream(file);                        byte[] b = new byte[1024];                        int charb = -1;                        int count = 0;                        while((charb = is.read(b))!=-1){                            fileOutputStream.write(b, 0, charb);                            count += charb;                        }                    }                    fileOutputStream.flush();                    if(fileOutputStream!=null){                        fileOutputStream.close();                    }                    down();                }  catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }.start();    }        Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);                            pd.cancel();            update();        }    };        /**     * 下载完成,通过handler将下载对话框取消     */    public void down(){        new Thread(){            public void run(){                Message message = handler.obtainMessage();                handler.sendMessage(message);            }        }.start();    }        /**     * 安装应用     */    public void update(){        Intent intent = new Intent(Intent.ACTION_VIEW);        intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory(),UPDATE_SERVERAPK))                , "application/vnd.android.package-archive");        startActivity(intent);    }}  

地址:http://www.cnblogs.com/shmily0703/archive/2012/04/19/shmily_apk_update.html


更多相关文章

  1. Android(安卓)SDK Manager无法更新的解决
  2. centOs7安装Android(安卓)Sdk详细教程
  3. android ndk与sdk
  4. android sdk 更新速度慢的解决办法
  5. Android获取包相关信息--code
  6. android环境搭建
  7. android gps经纬度实时更新,获取卫星数量
  8. Android(安卓)MTP之服务端UsbService启动
  9. Android(安卓)Studio第十五期 - 友盟统计集成

随机推荐

  1. Android有趣的全透明效果--Activity及Dia
  2. 实例:在Android调用WCF服务(wcf restful)
  3. Android开发资源完全汇总
  4. android 学习RxJava+Retrofit的资料
  5. Android EditText光标颜色 与inputType
  6. android 分辨率调试
  7. Android修行之路——Android程序设计基础
  8. 在 ubuntu10.04下 载 android源码 步骤
  9. android默认属性
  10. android设置按钮背景透明度与设置布局背