实现版本更新
来源:互联网 发布:常见的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
- Android版本更新实现
- 实现版本更新
- 实现版本更新
- 版本更新简单实现
- ios 实现版本更新检查
- ios 实现版本更新检查
- ios 实现版本更新检查
- Android 版本更新的实现
- Android App 版本更新实现
- android 版本更新的实现
- 简单实现App版本更新
- 一行代码实现版本更新
- 软件的版本更新检查实现
- C#实现程序的版本升级更新
- C#实现程序的版本升级更新
- C#实现程序的版本升级更新
- C#实现程序的版本升级更新
- C#实现程序的版本升级更新
- 三、生成器模式Builder(创建型)
- 未过代码求解 POJ 1062 昂贵的婚礼
- mac word从文档中删除个人信息
- 华为OJ 初级:在字符串中找出连续最长的数字串
- IOS获取各个文件目录路径的方法以及相关沙盒机制理解
- 实现版本更新
- 暑期训练Breadth-First Search by Foxpower
- POJ 3172 Scales (剪枝深搜)
- mybatis: Invalid bound statement (not found)
- Unity粒子系统简介
- Spring MVC的自定义拦截器(登录)
- 【leetcode】144. Binary Tree Preorder Traversal
- ecshop二次开发手册【基本结构】
- UVALive 6437 Power Plant(最小生成树)