实现版本更新

来源:互联网 发布:常见的nosql数据库 编辑:程序博客网 时间:2024/06/08 17:07

下面会通过代码和解说的方式简单去实现

  • 首先上方用到一个handler 去实现吐丝
Handler handler = new Handler() {        public void handleMessage(android.os.Message msg) {            switch (msg.what) {            case 0:                Toast.makeText(MainActivity.this, "版本号相同无需升级!", 0).show();                break;            case 1:                // 升级的弹框                showUpdataDialog();                Toast.makeText(MainActivity.this, "版本号不同需要升级!", 0).show();                break;            case 2:                break;            default:                break;            }        };    };

- 在onCreate方法中的调用

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //初始化控件        TextView tvname = (TextView) findViewById(R.id.tv_main_pagename);       //检测是否获取到当前的版本号        String versionName = getVersionName();        tvname.setText("当前版本号:" + versionName);    }
 - 获取本机的版本信息    private String getVersionName() {        // getPackageName()是你当前类的包名,0代表是获取版本信息        PackageInfo packInfo = null;        try {            // 获取packagemanager的实例            PackageManager packageManager = this.getPackageManager();            packInfo = packageManager.getPackageInfo(this.getPackageName(), 0);        } catch (Exception e) {            e.printStackTrace();        }        return packInfo.versionName;    }
  • 通过通过一个按钮的点击事件去实现版本更新的操作
// 版本更行的点击事件    public void versions(View v) {        // 版本更新的操作,  这个方法在下方实现        checkVersionTesk();    }
  • 从服务器获得 版本号 并且跟 当前的进行对比
public void checkVersionTesk() {        new Thread() {            private BanBean getname;            @Override            public void run() {                // TODO Auto-generated method stub                // 版本更新的接口   这只是我的                String path = "http://www.oschina.net/MobileAppVersion.xml";                try {                //网络请求                    URL url = new URL(path);                    HttpURLConnection openConnection = (HttpURLConnection) url                            .openConnection();                    int responseCode = openConnection.getResponseCode();                    if (responseCode == 200) {                        InputStream inputStream = openConnection                                .getInputStream();                        getname = getname(inputStream);                        // 返回对象 得到的信息                        String versionCode = getname.getVersionCode();                        downloadUrl = getname.getDownloadUrl();                        if (versionCode.equals(versionName)) {                            // 不需要升级                            handler.sendEmptyMessage(0);                        } else {                            // 需要升级                            handler.sendEmptyMessage(1);                        }                    }                } catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }.start();    }
  • 弹出对话框通知用户更新程序
    弹出对话框的步骤: 1.创建alertDialog的builder. 2.要给builder设置属性, 对话框的内容,样式,按钮
    3.通过builder 创建一个对话框 4.对话框show()出来
//此方法在handler中调用了public void showUpdataDialog() {        AlertDialog.Builder builer = new Builder(MainActivity.this);        builer.setTitle("版本升级");        builer.setMessage("检测到最新版本,确定要升级吗?");        // 当点确定按钮时从服务器上下载 新的apk 然后安装        builer.setPositiveButton("确定", new OnClickListener() {            public void onClick(DialogInterface dialog, int which) {                // Log.i(TAG, "下载apk,更新");                 downLoadApk();            }        });        // 当点取消按钮时进行登录        builer.setNegativeButton("取消", new OnClickListener() {            public void onClick(DialogInterface dialog, int which) {            }        });        AlertDialog dialog = builer.create();        dialog.show();    } - 从服务器中下载APK - 
 // 安装apkprotected void installApk(File file) {Intent intent = new Intent();// 执行动作intent.setAction(Intent.ACTION_VIEW);// 执行的数据类型intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");// 编者按:此处Android应为android,否则造成安装不了startActivity(intent);}
  • 从服务器下载apk:
public static File getFileFromServer(String path, ProgressDialog pd) {            // 如果相等的话表示当前的sdcard挂载在手机上并且是可用的            if (Environment.getExternalStorageState().equals(                    Environment.MEDIA_MOUNTED)) {                try {                    URL url = new URL(path);                    HttpURLConnection conn = (HttpURLConnection) url                            .openConnection();                    conn.setConnectTimeout(5000);                    // 获取到文件的大小                    pd.setMax(conn.getContentLength());                    InputStream is = conn.getInputStream();                    File file = new File(Environment.getExternalStorageDirectory(),                            "updata.apk");                    FileOutputStream fos = new FileOutputStream(file);                    BufferedInputStream bis = new BufferedInputStream(is);                    byte[] buffer = new byte[1024];                    int len;                    int total = 0;                    while ((len = bis.read(buffer)) != -1) {                        fos.write(buffer, 0, len);                        total += len;                        // 获取当前下载量                        pd.setProgress(total);                    }                    fos.close();                    bis.close();                    is.close();                    return file;                } catch (MalformedURLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (FileNotFoundException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            } else {                return null;            }            return null;        }
  • // 通过xml 解析版本更新的信息
public BanBean getname(InputStream inputStream) {        try {            XmlPullParser parser = Xml.newPullParser();            parser.setInput(inputStream, "utf-8");            int eventType = parser.getEventType();            BanBean banBean = new BanBean();            while (eventType != parser.END_DOCUMENT) {                String name = parser.getName();                switch (eventType) {                case XmlPullParser.START_TAG:                    if ("versionCode".equals(name)) {                        banBean.setVersionCode(parser.nextText());                    } else if ("versionName".equals(name)) {                        banBean.setVersionName(parser.nextText());                    } else if ("downloadUrl".equals(name)) {                        banBean.setDownloadUrl(parser.nextText());                    }                    break;                default:                    break;                }                eventType = parser.next();            }            return banBean;        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }
0 0
原创粉丝点击