DBMNG数据库管理与应用

才能是来自独创性。独创性是思维、观察、理解和判断的一种独特的方式。
当前位置:首页 > 移动应用 > Android

androidAPP程序自动更新/下载的实现


Android APP应用都有版本的更新,那么怎样实现更新呢?今天就为大家介绍应用自动更新的全过程。
程序自动更新的流程大致如下:
程序启动 -->适时后台检查更新--->链接远程服务器-->获取新版本信息
-->比对当前版本-->if(有更新)-->显示更新提示对话框并显示更新的内容-->交与用户选择.
下面是我做的demo,大家可以参考一下:
布局比较简单就不上代码了。
主程序代码:



001package com.cloay.update;
002  
003import java.io.IOException;
004import java.net.HttpURLConnection;
005import java.net.MalformedURLException;
006import java.net.URL;
007  
008import android.app.Activity;
009import android.app.AlertDialog;
010import android.content.DialogInterface;
011import android.content.pm.PackageManager.NameNotFoundException;
012import android.os.Bundle;
013import android.view.View;
014import android.view.View.OnClickListener;
015import android.widget.Button;
016import android.widget.Toast;
017/**
018 * 程序自动更新
019 * UpdateTestActivity.java
020 * @author Cloay
021 * 2011-11-23
022 */
023public class UpdateTestActivity extends Activity {
024    private Button button;
025    @Override
026    public void onCreate(Bundle savedInstanceState) {
027        super.onCreate(savedInstanceState);
028        setContentView(R.layout.main);
029          
030        button = (Button) findViewById(R.id.check);
031        button.setOnClickListener(new OnClickListener() {
032              
033            @Override
034            public void onClick(View v) {
035                try {
036                    checkVersion();
037                } catch (NameNotFoundException e) {
038                    // TODO Auto-generated catch block 
039                    e.printStackTrace();
040                }
041            }
042        });
043    }
044      
045    /**
046     * 检查是否需要更新程序
047     * @throws NameNotFoundException
048     */
049    private void checkVersion() throws NameNotFoundException{
050        UpdateInfo updateInfo = new UpdateInfo();
051        URL url;
052        try {
053            url = new URL("http://localhost:8080/update.xml");
054            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
055//          connection.setConnectTimeout(5000); 
056            updateInfo = ParseXmlUtils.parseXml(connection.getInputStream());
057              
058        } catch (MalformedURLException e) {
059            e.printStackTrace();
060        } catch (IOException e) {
061            e.printStackTrace();
062        }
063        if(updateInfo.getVersion().equals(VersionUtil.getVersionName(this))){
064            Toast.makeText(this, "版本相同,不需要升级!", Toast.LENGTH_SHORT).show();
065        }
066        else{
067            showUpdateDialog(updateInfo);
068        }
069    }
070  
071    private void showUpdateDialog(UpdateInfo updateInfo) {
072        AlertDialog alertDialog = new AlertDialog.Builder(this)
073        .setTitle("提示检测到新版本,确定升级吗?")
074        .setIcon(R.drawable.ask)
075        .setMessage(updateInfo.getDescription())
076        .setPositiveButton("确定"
077        new DialogInterface.OnClickListener() {
078            @Override
079            public void onClick(DialogInterface dialog, int which) {
080                dialog.cancel();  
081            }
082        })
083        .setNegativeButton("取消",
084        new DialogInterface.OnClickListener() {
085              
086            @Override
087            public void onClick(DialogInterface dialog, int which) {
088                dialog.cancel();    
089            }
090        }).create();
091        alertDialog.show();
092    }
093}
094package com.cloay.update;
095 
096import java.io.IOException;
097import java.net.HttpURLConnection;
098import java.net.MalformedURLException;
099import java.net.URL;
100 
101import android.app.Activity;
102import android.app.AlertDialog;
103import android.content.DialogInterface;
104import android.content.pm.PackageManager.NameNotFoundException;
105import android.os.Bundle;
106import android.view.View;
107import android.view.View.OnClickListener;
108import android.widget.Button;
109import android.widget.Toast;
110/**
111 * 程序自动更新
112 * UpdateTestActivity.java
113 * @author Cloay
114 * 2011-11-23
115 */
116public class UpdateTestActivity extends Activity {
117 private Button button;
118    @Override
119    public void onCreate(Bundle savedInstanceState) {
120        super.onCreate(savedInstanceState);
121        setContentView(R.layout.main);
122        
123        button = (Button) findViewById(R.id.check);
124        button.setOnClickListener(new OnClickListener() {
125    
126   @Override
127   public void onClick(View v) {
128    try {
129     checkVersion();
130    } catch (NameNotFoundException e) {
131     // TODO Auto-generated catch block
132     e.printStackTrace();
133    }
134   }
135  });
136    }
137    
138    /**
139     * 检查是否需要更新程序
140     * @throws NameNotFoundException
141     */
142    private void checkVersion() throws NameNotFoundException{
143     UpdateInfo updateInfo = new UpdateInfo();
144     URL url;
145  try {
146   url = new URL("http://localhost:8080/update.xml");
147   HttpURLConnection connection = (HttpURLConnection) url.openConnection();
148//   connection.setConnectTimeout(5000);
149   updateInfo = ParseXmlUtils.parseXml(connection.getInputStream());
150    
151  } catch (MalformedURLException e) {
152   e.printStackTrace();
153  } catch (IOException e) {
154   e.printStackTrace();
155  }
156  if(updateInfo.getVersion().equals(VersionUtil.getVersionName(this))){
157   Toast.makeText(this, "版本相同,不需要升级!", Toast.LENGTH_SHORT).show();
158  }
159  else{
160   showUpdateDialog(updateInfo);
161  }
162    }
163 
164 private void showUpdateDialog(UpdateInfo updateInfo) {
165  AlertDialog alertDialog = new AlertDialog.Builder(this)
166  .setTitle("提示检测到新版本,确定升级吗?")
167  .setIcon(R.drawable.ask)
168  .setMessage(updateInfo.getDescription())
169  .setPositiveButton("确定",
170  new DialogInterface.OnClickListener() {
171   @Override
172   public void onClick(DialogInterface dialog, int which) {
173    dialog.cancel();
174   }
175  })
176  .setNegativeButton("取消",
177  new DialogInterface.OnClickListener() {
178    
179   @Override
180   public void onClick(DialogInterface dialog, int which) {
181    dialog.cancel();  
182   }
183  }).create();
184  alertDialog.show();
185 }
186}
187 
188  
189 
190这里说明一下:远程服务器放置一个xml文件,用来说明当前新版本的信息。包括版本号,新版本功能说明,新版下载链接
191 
192  
193 
194 
195xml解析工具代码:
196 
197 
198package com.cloay.update;
199  
200import java.io.IOException;
201import java.io.InputStream;
202  
203import javax.xml.parsers.DocumentBuilder;
204import javax.xml.parsers.DocumentBuilderFactory;
205import javax.xml.parsers.ParserConfigurationException;
206  
207import org.w3c.dom.Document;
208import org.w3c.dom.Element;
209import org.w3c.dom.NodeList;
210import org.xml.sax.SAXException;
211/**
212 * 解析Xml文件
213 * ParseXmlUtils.java
214 * @author Cloay
215 * 2011-11-7
216 */
217public class ParseXmlUtils {
218    /**
219     * 通过InputStream 解析文件
220     * @param in
221     * @return
222     */
223    public static UpdateInfo parseXml(InputStream in){
224        UpdateInfo updateInfo = new UpdateInfo();
225        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();          
226        DocumentBuilder db = null;      
227        try {
228            db = dbf.newDocumentBuilder();
229            Document doc = null;    
230            doc = db.parse(in); 
231            Element root = doc.getDocumentElement();
232            NodeList resultNode = root.getElementsByTagName("info");    
233            for(int i = 0; i < resultNode.getLength();i++){    
234                Element res = (Element)resultNode.item(i);  
235                updateInfo.setVersion(res.getElementsByTagName("version").item(0).getFirstChild().getNodeValue());
236                updateInfo.setUrl(res.getElementsByTagName("url").item(0).getFirstChild().getNodeValue());
237                updateInfo.setDescription(res.getElementsByTagName("description").item(0).getFirstChild().getNodeValue());
238            }
239        } catch (ParserConfigurationException e) {
240            e.printStackTrace();
241        } catch (SAXException e) {
242            e.printStackTrace();
243        } catch (IOException e) {
244            e.printStackTrace();
245        }      
246        return updateInfo;
247    }
248}
249 
250package com.cloay.update;
251 
252import java.io.IOException;
253import java.io.InputStream;
254 
255import javax.xml.parsers.DocumentBuilder;
256import javax.xml.parsers.DocumentBuilderFactory;
257import javax.xml.parsers.ParserConfigurationException;
258 
259import org.w3c.dom.Document;
260import org.w3c.dom.Element;
261import org.w3c.dom.NodeList;
262import org.xml.sax.SAXException;
263/**
264 * 解析Xml文件
265 * ParseXmlUtils.java
266 * @author Cloay
267 * 2011-11-7
268 */
269public class ParseXmlUtils {
270 /**
271  * 通过InputStream 解析文件
272  * @param in
273  * @return
274  */
275 public static UpdateInfo parseXml(InputStream in){
276  UpdateInfo updateInfo = new UpdateInfo();
277  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();        
278     DocumentBuilder db = null;    
279     try {
280   db = dbf.newDocumentBuilder();
281   Document doc = null;  
282   doc = db.parse(in);
283   Element root = doc.getDocumentElement();
284   NodeList resultNode = root.getElementsByTagName("info");  
285   for(int i = 0; i < resultNode.getLength();i++){  
286    Element res = (Element)resultNode.item(i);
287    updateInfo.setVersion(res.getElementsByTagName("version").item(0).getFirstChild().getNodeValue());
288    updateInfo.setUrl(res.getElementsByTagName("url").item(0).getFirstChild().getNodeValue());
289    updateInfo.setDescription(res.getElementsByTagName("description").item(0).getFirstChild().getNodeValue());
290   }
291  } catch (ParserConfigurationException e) {
292   e.printStackTrace();
293  } catch (SAXException e) {
294   e.printStackTrace();
295  } catch (IOException e) {
296   e.printStackTrace();
297  }    
298  return updateInfo;
299 }
300}
301 
302updateInfo实体:
303 
304 
305package com.cloay.update;
306/**
307 * 更新信息实体类
308 * UpdateInfo.java
309 * @author Cloay
310 * 2011-11-23
311 */
312public class UpdateInfo {  
313    private String version;    //版本号 
314    private String url;     //新版本存放url路径 
315    private String description;   //更新说明信息,比如新增什么功能特性等 
316    public String getVersion() {  
317        return version;  
318    }  
319    public void setVersion(String version) {  
320        this.version = version;  
321    }  
322    public String getUrl() {  
323        return url;  
324    }  
325    public void setUrl(String url) {  
326        this.url = url;  
327    }  
328    public String getDescription() {  
329        return description;  
330    }  
331    public void setDescription(String description) {  
332        this.description = description;  
333    }  
334
335package com.cloay.update;
336/**
337 * 更新信息实体类
338 * UpdateInfo.java
339 * @author Cloay
340 * 2011-11-23
341 */
342public class UpdateInfo {
343    private String version;    //版本号
344    private String url;   //新版本存放url路径
345    private String description;   //更新说明信息,比如新增什么功能特性等
346    public String getVersion() {
347        return version;
348    }
349    public void setVersion(String version) {
350        this.version = version;
351    }
352    public String getUrl() {
353        return url;
354    }
355    public void setUrl(String url) {
356        this.url = url;
357    }
358    public String getDescription() {
359        return description;
360    }
361    public void setDescription(String description) {
362        this.description = description;
363    }
364}  </span>
365获取当前已安装版本信息:
366 
367 
368package com.cloay.update;
369  
370import android.content.Context;
371import android.content.pm.PackageInfo;
372import android.content.pm.PackageManager;
373import android.content.pm.PackageManager.NameNotFoundException;
374  
375/**
376 * 版本工具类
377 * VersionUtil.java
378 * @author Cloay
379 * 2011-11-23
380 */
381public class VersionUtil {
382    /**
383     * 获取版本号
384     * @param context
385     *          上下文
386     * @return
387     * @throws NameNotFoundException
388     */
389    public static String getVersionName(Context context) throws NameNotFoundException{
390        //获取PackageManager 实例 
391        PackageManager packageManager = context.getPackageManager();
392        //获得context所属类的包名,0表示获取版本信息 
393        PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
394        return packageInfo.versionName;
395    }
396}
397 
398package com.cloay.update;
399 
400import android.content.Context;
401import android.content.pm.PackageInfo;
402import android.content.pm.PackageManager;
403import android.content.pm.PackageManager.NameNotFoundException;
404 
405/**
406 * 版本工具类
407 * VersionUtil.java
408 * @author Cloay
409 * 2011-11-23
410 */
411public class VersionUtil {
412 /**
413  * 获取版本号
414  * @param context
415  *    上下文
416  * @return
417  * @throws NameNotFoundException
418  */
419 public static String getVersionName(Context context) throws NameNotFoundException{
420  //获取PackageManager 实例
421  PackageManager packageManager = context.getPackageManager();
422  //获得context所属类的包名,0表示获取版本信息
423  PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
424  return packageInfo.versionName;
425 }
426}
427 
428其实整个过程并不是很麻烦,需要注释的地方都已详细注释了,就写那么多。有问题请留言大家一起交流学习!


本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2025 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号