实现版本更新

时间:2022-12-21 21:16:58

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

  • 首先上方用到一个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
 - 
 // 安装apk
protected 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;

    }