android之程序自动更新的实现

应用都有版本的更新,那么怎样实现更新呢?今天就为大家介绍应用自动更新的全过程。

程序自动更新的流程大致如下:

程序启动 -->适时后台检查更新--->链接远程服务器-->获取新版本信息

-->比对当前版本-->if(有更新)-->显示更新提示对话框并显示更新的内容-->交与用户选择.


下面是我做的demo,大家可以参考一下:

布局比较简单就不上代码了。

主程序代码:

[java] view
plain
copy

  1. package com.cloay.update;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.HttpURLConnection;  
  5. import java.net.MalformedURLException;  
  6. import java.net.URL;  
  7.   
  8. import android.app.Activity;  
  9. import android.app.AlertDialog;  
  10. import android.content.DialogInterface;  
  11. import android.content.pm.PackageManager.NameNotFoundException;  
  12. import android.os.Bundle;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.Toast;  
  17. /** 
  18.  * 程序自动更新 
  19.  * UpdateTestActivity.java 
  20.  * @author Cloay 
  21.  * 2011-11-23 
  22.  */  
  23. public class UpdateTestActivity extends Activity {  
  24.     private Button button;  
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.main);  
  29.           
  30.         button = (Button) findViewById(R.id.check);  
  31.         button.setOnClickListener(new OnClickListener() {  
  32.               
  33.             @Override  
  34.             public void onClick(View v) {  
  35.                 try {  
  36.                     checkVersion();  
  37.                 } catch (NameNotFoundException e) {  
  38.                     // TODO Auto-generated catch block  
  39.                     e.printStackTrace();  
  40.                 }  
  41.             }  
  42.         });  
  43.     }  
  44.       
  45.     /** 
  46.      * 检查是否需要更新程序 
  47.      * @throws NameNotFoundException  
  48.      */  
  49.     private void checkVersion() throws NameNotFoundException{  
  50.         UpdateInfo updateInfo = new UpdateInfo();  
  51.         URL url;  
  52.         try {  
  53.             url = new URL("http://localhost:8080/update.xml");  
  54.             HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
  55. //          connection.setConnectTimeout(5000);  
  56.             updateInfo = ParseXmlUtils.parseXml(connection.getInputStream());  
  57.               
  58.         } catch (MalformedURLException e) {  
  59.             e.printStackTrace();  
  60.         } catch (IOException e) {  
  61.             e.printStackTrace();  
  62.         }  
  63.         if(updateInfo.getVersion().equals(VersionUtil.getVersionName(this))){  
  64.             Toast.makeText(this, "版本相同,不需要升级!", Toast.LENGTH_SHORT).show();  
  65.         }  
  66.         else{  
  67.             showUpdateDialog(updateInfo);  
  68.         }  
  69.     }  
  70.   
  71.     private void showUpdateDialog(UpdateInfo updateInfo) {  
  72.         AlertDialog alertDialog = new AlertDialog.Builder(this)  
  73.         .setTitle("提示检测到新版本,确定升级吗?")  
  74.         .setIcon(R.drawable.ask)  
  75.         .setMessage(updateInfo.getDescription())  
  76.         .setPositiveButton("确定",   
  77.         new DialogInterface.OnClickListener() {  
  78.             @Override  
  79.             public void onClick(DialogInterface dialog, int which) {  
  80.                 dialog.cancel();    
  81.             }  
  82.         })  
  83.         .setNegativeButton("取消",  
  84.         new DialogInterface.OnClickListener() {  
  85.               
  86.             @Override  
  87.             public void onClick(DialogInterface dialog, int which) {  
  88.                 dialog.cancel();      
  89.             }  
  90.         }).create();  
  91.         alertDialog.show();  
  92.     }  
  93. }  


这里说明一下:远程服务器放置一个xml文件,用来说明当前新版本的信息。包括版本号,新版本功能说明,新版下载链接

xml解析工具代码:

[java] view
plain
copy

  1. <span style="font-size:10px;">package com.cloay.update;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5.   
  6. import javax.xml.parsers.DocumentBuilder;  
  7. import javax.xml.parsers.DocumentBuilderFactory;  
  8. import javax.xml.parsers.ParserConfigurationException;  
  9.   
  10. import org.w3c.dom.Document;  
  11. import org.w3c.dom.Element;  
  12. import org.w3c.dom.NodeList;  
  13. import org.xml.sax.SAXException;  
  14. /** 
  15.  * 解析Xml文件 
  16.  * ParseXmlUtils.java 
  17.  * @author Cloay 
  18.  * 2011-11-7 
  19.  */  
  20. public class ParseXmlUtils {  
  21.     /** 
  22.      * 通过InputStream 解析文件 
  23.      * @param in 
  24.      * @return 
  25.      */  
  26.     public static UpdateInfo parseXml(InputStream in){  
  27.         UpdateInfo updateInfo = new UpdateInfo();  
  28.         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();            
  29.         DocumentBuilder db = null;        
  30.         try {  
  31.             db = dbf.newDocumentBuilder();  
  32.             Document doc = null;      
  33.             doc = db.parse(in);   
  34.             Element root = doc.getDocumentElement();  
  35.             NodeList resultNode = root.getElementsByTagName("info");      
  36.             for(int i = 0; i < resultNode.getLength();i++){      
  37.                 Element res = (Element)resultNode.item(i);    
  38.                 updateInfo.setVersion(res.getElementsByTagName("version").item(0).getFirstChild().getNodeValue());  
  39.                 updateInfo.setUrl(res.getElementsByTagName("url").item(0).getFirstChild().getNodeValue());  
  40.                 updateInfo.setDescription(res.getElementsByTagName("description").item(0).getFirstChild().getNodeValue());  
  41.             }  
  42.         } catch (ParserConfigurationException e) {  
  43.             e.printStackTrace();  
  44.         } catch (SAXException e) {  
  45.             e.printStackTrace();  
  46.         } catch (IOException e) {  
  47.             e.printStackTrace();  
  48.         }        
  49.         return updateInfo;  
  50.     }  
  51. }  
  52. </span>  

updateInfo实体:

[java] view
plain
copy

  1. <span style="font-size:10px;">package com.cloay.update;  
  2. /** 
  3.  * 更新信息实体类 
  4.  * UpdateInfo.java 
  5.  * @author Cloay 
  6.  * 2011-11-23 
  7.  */  
  8. public class UpdateInfo {    
  9.     private String version;    //版本号  
  10.     private String url;     //新版本存放url路径  
  11.     private String description;   //更新说明信息,比如新增什么功能特性等  
  12.     public String getVersion() {    
  13.         return version;    
  14.     }    
  15.     public void setVersion(String version) {    
  16.         this.version = version;    
  17.     }    
  18.     public String getUrl() {    
  19.         return url;    
  20.     }    
  21.     public void setUrl(String url) {    
  22.         this.url = url;    
  23.     }    
  24.     public String getDescription() {    
  25.         return description;    
  26.     }    
  27.     public void setDescription(String description) {    
  28.         this.description = description;    
  29.     }    
  30. }  </span>  

获取当前已安装版本信息:

[java] view
plain
copy

  1. <span style="font-size:10px;">package com.cloay.update;  
  2.   
  3. import android.content.Context;  
  4. import android.content.pm.PackageInfo;  
  5. import android.content.pm.PackageManager;  
  6. import android.content.pm.PackageManager.NameNotFoundException;  
  7.   
  8. /** 
  9.  * 版本工具类 
  10.  * VersionUtil.java 
  11.  * @author Cloay 
  12.  * 2011-11-23 
  13.  */  
  14. public class VersionUtil {  
  15.     /** 
  16.      * 获取版本号 
  17.      * @param context 
  18.      *          上下文 
  19.      * @return 
  20.      * @throws NameNotFoundException  
  21.      */  
  22.     public static String getVersionName(Context context) throws NameNotFoundException{  
  23.         //获取PackageManager 实例  
  24.         PackageManager packageManager = context.getPackageManager();  
  25.         //获得context所属类的包名,0表示获取版本信息  
  26.         PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);  
  27.         return packageInfo.versionName;  
  28.     }  
  29. }  
  30. </span>  

其实整个过程并不是很麻烦,需要注释的地方都已详细注释了,就写那么多。有问题请留言大家一起交流学习!

时间: 2024-07-28 19:59:02

android之程序自动更新的实现的相关文章

Android程序自动更新功能模块的实现方法【附完整demo源码下载】_Android

本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更新模块检测服务器上存放的版本号跟当前程序的版本号如果大于当前版本号,弹出更新对话框,如果用户选择更新,则显示当前更新状态,然后替换当前程序. 程序调用版本更新检测: private UpdateManager updateMan; private ProgressDialog updateProgr

Android应用APP自动更新功能的代码实现_Android

由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必要给我们的Android应用增加自动更新的功能. 既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件,存放软件的版本信息: <update> <version>2</version> <name>baidu

iphone5s/5c开启与关闭应用程序自动更新

应用程序自动更新 1.在ios7系统中我们点击"设置" 如图所示: 2.然后如图我们找到"iTunes Store和App Store"选项: 3.在appstore界面中我们点击"自动下载的项目"里面有"更新",打开就行了 如下图所示: 4.这些都是自己更新的: 5.以后在有WIFI的网络里面就不用怕软件更新太多太麻烦了!所有的都程序自己搞定了! IOS如何关闭程序自动更新 1.关闭自动更新设置关前提是我们己经开启了自动更新

Android应用APP自动更新功能的代码实现

由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必要给我们的Android应用增加自动更新的功能. 既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件,存放软件的版本信息: <update> <version>2</version> <name>baidu

C#利用批处理实现正在运行的程序自动更新

关于自动更新,在.NET下面已经是很普通的事情,无非就是在服务器端保存配置好要更新的程序,然后客 户端再写一个小程序来检测,有更新的则复制过来.就这么个思路,这么个简单的问题还要占一篇首页?但你 可别急,看看我的标题,再慢慢的看下去,或许哪一天,你可能还真的会用得着呢,就算用不着,相信对各位回 头温习一下久违的Command也是不错呀! 利用ShareDevelop的ICSharpCode.Core实现了一个插件应用程序,这两天想要弄个自动更新,将更新功 能作为插件包括在应用程序中,本来以为按照

Android接入百度自动更新SDK

一:前言 公司的app,上传到百度应用市场,然后说必须要接入百度的自动更新sdk才能上架,于是从百度官网上去下载jar包,下载的时候必须要带上数据统计,如果使用自动的jar包,还需要带上广告联盟,坑爹啊,有木有.我下载下来把其他无关的jar包根so文件删掉了.把百度的demo也进行精简了一下.只留下了自动更新必须要用到的. 二:效果图如下 三:代码如下 AutoUpdateActivity.java  代码删的就剩下整个Activity了,其实调用百度sdk还挺简单的,一句话就能搞定,然后再监听

联通回应iPhone偷流量质疑:某些程序自动更新

联通版iPhone 3G/3GS(新浪科技配图) 本报讯 (记者 田丛) 在 中国市场连番掀起热潮的iPhone手机,近日接连遭遇用户有关"偷流量"的质疑,有用户称在待机状态下,手机经常半夜自己走流量.昨日,记者从中国联通方面了解到,一些智能手机的某些程序会自动更新,从而产生流量. 推送产生"不知情"流量 一位用户反映,他用的是286元的"合约计划",套餐内每月的数据流量有1G,前两个月流量剩余很多,但在10月份流量很快就用完了.该用户查询数据账

联通回应iPhone偷流量:某些程序自动更新

在中国市场连番掀起热潮的http://www.aliyun.com/zixun/aggregation/9484.html">iPhone手机,近日接连遭遇用户有关"偷流量"的质疑,有用户称在待机状态下,手机经常半夜自己走流量.昨日,记者从中国联通方面了解到,一些智能手机的某些程序会自动更新,从而产生流量. 推送产生"不知情"流量 一位用户反映,他用的是286元的"合约计划",套餐内每月的数据流量有1G,前两个月流量剩余很多,但在

苹果5s怎样取消iOS7程序自动更新功能

1.如下图以iphone5s为例子,我们点击"设置" 按钮进入,如图. 2.然后在设置页面中我会往下看会看到有一个"iTunes Store 和 App Store"菜单点击进入. 3.在进入到了iTunes Store 和 App Store界面我们会看到有一个"更新"开关  4.关掉 App 的自动更新以后,就跟原来的 iOS6 一样,会在 App Store 图标的右上角出现可用更新的数字提示,如图所示 5.有更提醒了我们就可以点击&quo