转: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 @Override 104 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>