转:http://blog.csdn.net/furongkang/article/details/6886526

步骤:

1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。

2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

效果图:

获取当前程序的版本号:

 1     /* 2      * 获取当前程序的版本号  3      */ 4     private String getVersionName() throws Exception{ 5         //获取packagemanager的实例  6         PackageManager packageManager = getPackageManager(); 7         //getPackageName()是你当前类的包名,0代表是获取版本信息 8         PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); 9         return packInfo.versionName; 10     }

获取服务器端的版本号:

 1     /* 2      * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号) 3      */ 4     public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{ 5         XmlPullParser  parser = Xml.newPullParser();   6         parser.setInput(is, "utf-8");//设置解析的数据源  7         int type = parser.getEventType(); 8         UpdataInfo info = new UpdataInfo();//实体 9         while(type != XmlPullParser.END_DOCUMENT ){10             switch (type) {11             case XmlPullParser.START_TAG:12                 if("version".equals(parser.getName())){13                     info.setVersion(parser.nextText());    //获取版本号14                 }else if ("url".equals(parser.getName())){15                     info.setUrl(parser.nextText());    //获取要升级的APK文件16                 }else if ("description".equals(parser.getName())){17                     info.setDescription(parser.nextText());    //获取该文件的信息18                 }19                 break;20             }21             type = parser.next();22         }23         return info;24     }

从服务器下载apk:

 1     public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{ 2         //如果相等的话表示当前的sdcard挂载在手机上并且是可用的 3         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 4             URL url = new URL(path); 5             HttpURLConnection conn =  (HttpURLConnection) url.openConnection(); 6             conn.setConnectTimeout(5000); 7             //获取到文件的大小  8             pd.setMax(conn.getContentLength()); 9             InputStream is = conn.getInputStream();10             File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");11             FileOutputStream fos = new FileOutputStream(file);12             BufferedInputStream bis = new BufferedInputStream(is);13             byte[] buffer = new byte[1024];14             int len ;15             int total=0;16             while((len =bis.read(buffer))!=-1){17                 fos.write(buffer, 0, len);18                 total+= len;19                 //获取当前下载量20                 pd.setProgress(total);21             }22             fos.close();23             bis.close();24             is.close();25             return file;26         }27         else{28             return null;29         }30     }

匹配、下载、自动安装:

  1     /*  2      * 从服务器获取xml解析并进行比对版本号   3      */  4     public class CheckVersionTask implements Runnable{  5   6         public void run() {  7             try {  8                 //从资源文件获取服务器 地址   9                 String path = getResources().getString(R.string.serverurl); 10                 //包装成url的对象  11                 URL url = new URL(path); 12                 HttpURLConnection conn =  (HttpURLConnection) url.openConnection();  13                 conn.setConnectTimeout(5000); 14                 InputStream is =conn.getInputStream();  15                 info =  UpdataInfoParser.getUpdataInfo(is); 16                  17                 if(info.getVersion().equals(versionname)){ 18                     Log.i(TAG,"版本号相同无需升级"); 19                     LoginMain(); 20                 }else{ 21                     Log.i(TAG,"版本号不同 ,提示用户升级 "); 22                     Message msg = new Message(); 23                     msg.what = UPDATA_CLIENT; 24                     handler.sendMessage(msg); 25                 } 26             } catch (Exception e) { 27                 // 待处理  28                 Message msg = new Message(); 29                 msg.what = GET_UNDATAINFO_ERROR; 30                 handler.sendMessage(msg); 31                 e.printStackTrace(); 32             }  33         } 34     } 35      36     Handler handler = new Handler(){ 37          38         @Override 39         public void handleMessage(Message msg) { 40             // TODO Auto-generated method stub 41             super.handleMessage(msg); 42             switch (msg.what) { 43             case UPDATA_CLIENT: 44                 //对话框通知用户升级程序  45                 showUpdataDialog(); 46                 break; 47             case GET_UNDATAINFO_ERROR: 48                 //服务器超时  49                 Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show(); 50                 LoginMain(); 51                 break;     52             case DOWN_ERROR: 53                 //下载apk失败 54                 Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show(); 55                 LoginMain(); 56                 break;     57             } 58         } 59     }; 60      61     /* 62      *  63      * 弹出对话框通知用户更新程序  64      *  65      * 弹出对话框的步骤: 66      *     1.创建alertDialog的builder.   67      *    2.要给builder设置属性, 对话框的内容,样式,按钮 68      *    3.通过builder 创建一个对话框 69      *    4.对话框show()出来   70      */ 71     protected void showUpdataDialog() { 72         AlertDialog.Builder builer = new Builder(this) ;  73         builer.setTitle("版本升级"); 74         builer.setMessage(info.getDescription()); 75         //当点确定按钮时从服务器上下载 新的apk 然后安装  76         builer.setPositiveButton("确定", new OnClickListener() { 77         public void onClick(DialogInterface dialog, int which) { 78                 Log.i(TAG,"下载apk,更新"); 79                 downLoadApk(); 80             }    81         }); 82         //当点取消按钮时进行登录 83         builer.setNegativeButton("取消", new OnClickListener() { 84             public void onClick(DialogInterface dialog, int which) { 85                 // TODO Auto-generated method stub 86                 LoginMain(); 87             } 88         }); 89         AlertDialog dialog = builer.create(); 90         dialog.show(); 91     } 92      93     /* 94      * 从服务器中下载APK 95      */ 96     protected void downLoadApk() { 97         final ProgressDialog pd;    //进度条对话框 98         pd = new  ProgressDialog(this); 99         pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);100         pd.setMessage("正在下载更新");101         pd.show();102         new Thread(){103             @Override104             public void run() {105                 try {106                     File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);107                     sleep(3000);108                     installApk(file);109                     pd.dismiss(); //结束掉进度条对话框110                 } catch (Exception e) {111                     Message msg = new Message();112                     msg.what = DOWN_ERROR;113                     handler.sendMessage(msg);114                     e.printStackTrace();115                 }116             }}.start();117     }118     119     //安装apk 120     protected void installApk(File file) {121         Intent intent = new Intent();122         //执行动作123         intent.setAction(Intent.ACTION_VIEW);124         //执行的数据类型125         intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");126         startActivity(intent);127     }128     129     /*130      * 进入程序的主界面131      */132     private void LoginMain(){133         Intent intent = new Intent(this,MainActivity.class);134         startActivity(intent);135         //结束掉当前的activity 136         this.finish();137     }

UpdataInfo:

 1 public class UpdataInfo { 2     private String version; 3     private String url; 4     private String description; 5     public String getVersion() { 6         return version; 7     } 8     public void setVersion(String version) { 9         this.version = version;10     }11     public String getUrl() {12         return url;13     }14     public void setUrl(String url) {15         this.url = url;16     }17     public String getDescription() {18         return description;19     }20     public void setDescription(String description) {21         this.description = description;22     }23 }

update.xml:

1 <?xml version="1.0" encoding="utf-8"?>2 <info>3     <version>2.0</version>4     <url>http://192.168.1.187:8080/mobilesafe.apk</url>5     <description>检测到最新版本,请及时更新!</description>6 </info>

更多相关文章

  1. 利用drozer进行Android渗透测试
  2. 花样Android(安卓)ProgressBar 史上最强大讲解
  3. android 按钮倒计时读秒
  4. Android(安卓)SQLite数据库升级的问题
  5. Android(安卓)常用dialog提示对话框
  6. android获取手机流量使用情况
  7. Android(安卓)Sudio 如何获取SHA1(开发版和发布版)
  8. Android应用程序获取ROOT权限的方法
  9. Android传感器编程入门(二)

随机推荐

  1. Android(安卓)采用Lame编码器编码mp3文件
  2. Android(安卓)Studio gradle生成jar
  3. android bitmap out of memory总结、心得
  4. android的各种权限,请记得在androidmanife
  5. Android(安卓)Studio下Svn忽略文件配置的
  6. Android(安卓)自定义弹出对话框实例
  7. 音乐播放器之简单播放(MediaPlayer、Servi
  8. android在String资源文件中加入符号
  9. 魅族MX2 Smartbar的支持
  10. Android(安卓)学习笔记--android――Asyn