Android 自动更新APK

来源:互联网 发布:dota2 英雄联盟 知乎 编辑:程序博客网 时间:2024/06/08 16:20
   <pre name="code" class="java">第一次写博客,可能很多地方没表述清楚,请大家一定提出,我会多加改正,让博客的质量越来越好,下面直奔主题:基本上每个应用都有这个功能:版本更新,当然我们公司的应用也不例外,由于我也是才接触Android,所以借鉴了许多前辈的方法,结合自己的了解和网上查阅的资料,总结了版本更新的主要逻辑如下:   1:获取当前应用的版本号、版本名称等   2:用当前版本号和原来的进行对比   3:如果版本相同,这提示是最新版本,不相同则去下载新的apk   4:用新的apk替换掉原来的apk,下面分别介绍,粗糙代码,多多包涵   1:获取版本等:/** * 获取当前版本号 */public int getVersionCode() throws Exception {// 获取PackageManager的实例PackageManager packageManager = getPackageManager();// getPackageName()是你当前类的包名,0代表是获取版本信息PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),0);return packInfo.versionCode;}/** * 获取当前版本名称 */public String getVersionName() throws Exception {// 获取PackageManager的实例PackageManager packageManager = getPackageManager();// getPackageName()是你当前类的包名,0代表是获取版本信息PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),0);return packInfo.versionName;}     2:对比版本号/** * 从服务器获取XML文件解析并进行对比版本号 */public void checkUpdate() {try {// XML文件的路径String path = getResources().getString(R.string.serverurl);// 包装成URL对象URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 获取写入流对象InputStream is = conn.getInputStream();info = UpdataInfoManager.getUpdataInfo(is);// 获取版本号versionname = getVersionName();// 版本号相同,无需升级if (info.getVersion().equals(versionname)) {pro_Dialog.dismiss();thread = new Thread(runnable);thread.start();}// 版本号不同,提示用户升级else {Message msg = new Message();msg.what = UPDATA_CLIENT;handler.sendMessage(msg);}} catch (Exception e) {// 待处理Message msg = new Message();msg.what = GET_UNDATAINFO_ERROR;handler.sendMessage(msg);e.printStackTrace();}}   3:下载新的apk/** * 下载更新的方法 */protected void downLoadApk() {// 得到更新地址final String path = info.getUrl();// 创建更新对话框pd = new ProgressDialog(this);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setMessage("正在下载更新");pd.show();// 创建线程开始更新new Thread() {@Overridepublic void run() {try {file = getFileFromServer(path, pd);} catch (Exception e) {// 创建消息对象Message msg = new Message();msg.what = DOWN_ERROR;// 将消息发送出去handler.sendMessage(msg);e.printStackTrace();}}}.start();}/** * 下载更新 * @param path * @param pd * @return file * @throws Exception */public File getFileFromServer(String path, ProgressDialog pd)throws Exception {URL url = new URL(path);conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);pd.setMax(100);is = conn.getInputStream();// 定义File用来存放apkFile file = new File(Environment.getExternalStorageDirectory(),"main.apk");// 判断文件是否存在,不存在则重新创建if (!file.exists()) {file.createNewFile();}// 否则就删除else {file.delete();}// 获取读写流对象fos = new FileOutputStream(file);bis = new BufferedInputStream(is);byte[] buffer = new byte[1024];// 定义变量表示下载的进度int len = 0;int cur = 0;// 获取文件大小int total = conn.getContentLength();while ((len = bis.read(buffer)) != -1) {fos.write(buffer, 0, len);cur += len;// 获取当前下载量progress = (int) (((float) cur / total) * 100);handler.sendEmptyMessage(DOWNLOAD_ING);}if (len == -1) {handler.sendEmptyMessage(DOWNLOAD_OVER);}// 关闭读写流fos.close();bis.close();is.close();return file;}// 声明Handler接口用来判断更新状态Handler handler = new Handler() {@SuppressLint("HandlerLeak")@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case UPDATA_CLIENT:pro_Dialog.dismiss();// 对话框提示用户升级showUpdataDialog();break;case DOWNLOAD_ING:// 显示下载进度条pd.setProgress(progress);break;case GET_UNDATAINFO_ERROR:pro_Dialog.dismiss();// 服务器超时Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show();thread = new Thread(runnable);thread.start();break;case DOWN_ERROR:// 下载apk失败Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();break;case DOWNLOAD_OVER:// 下载apk成功Toast.makeText(VersionActivity.this, "下载完成", 1).show();pd.dismiss();// 安装apkinstallApk(file);break;}}};    4:最后就是替换成最新apk了/** * 安装apk的方法 * @param file */protected void installApk(File file) {Intent intent = new Intent();// 执行动作intent.setAction(Intent.ACTION_VIEW);// 得到apk的路径String openPath = Environment.getExternalStorageDirectory() + "/"+ "main.apk";// 执行的数据类型intent.setDataAndType(Uri.parse("file://" + openPath),"application/vnd.android.package-archive");this.startActivity(intent);}以上就是我学到的更新版本的东西了,我也是站在巨人的肩膀上看世界,感谢那些无私奉献的程序员们。希望我的技术越来越好,博客也越写越好。

</pre><pre class="java" name="code">