androidAPP程序自动更新/下载的实现
Android APP应用都有版本的更新,那么怎样实现更新呢?今天就为大家介绍应用自动更新的全过程。
程序自动更新的流程大致如下:
程序启动 -->适时后台检查更新--->链接远程服务器-->获取新版本信息
-->比对当前版本-->if(有更新)-->显示更新提示对话框并显示更新的内容-->交与用户选择.
下面是我做的demo,大家可以参考一下:
布局比较简单就不上代码了。
主程序代码:
001 | package com.cloay.update; |
003 | import java.io.IOException; |
004 | import java.net.HttpURLConnection; |
005 | import java.net.MalformedURLException; |
008 | import android.app.Activity; |
009 | import android.app.AlertDialog; |
010 | import android.content.DialogInterface; |
011 | import android.content.pm.PackageManager.NameNotFoundException; |
012 | import android.os.Bundle; |
013 | import android.view.View; |
014 | import android.view.View.OnClickListener; |
015 | import android.widget.Button; |
016 | import android.widget.Toast; |
019 | * UpdateTestActivity.java |
023 | public class UpdateTestActivity extends Activity { |
024 | private Button button; |
026 | public void onCreate(Bundle savedInstanceState) { |
027 | super .onCreate(savedInstanceState); |
028 | setContentView(R.layout.main); |
030 | button = (Button) findViewById(R.id.check); |
031 | button.setOnClickListener( new OnClickListener() { |
034 | public void onClick(View v) { |
037 | } catch (NameNotFoundException e) { |
047 | * @throws NameNotFoundException |
049 | private void checkVersion() throws NameNotFoundException{ |
050 | UpdateInfo updateInfo = new UpdateInfo(); |
054 | HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
056 | updateInfo = ParseXmlUtils.parseXml(connection.getInputStream()); |
058 | } catch (MalformedURLException e) { |
060 | } catch (IOException e) { |
063 | if (updateInfo.getVersion().equals(VersionUtil.getVersionName( this ))){ |
064 | Toast.makeText( this , "版本相同,不需要升级!" , Toast.LENGTH_SHORT).show(); |
067 | showUpdateDialog(updateInfo); |
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() { |
079 | public void onClick(DialogInterface dialog, int which) { |
083 | .setNegativeButton( "取消" , |
084 | new DialogInterface.OnClickListener() { |
087 | public void onClick(DialogInterface dialog, int which) { |
094 | package com.cloay.update; |
096 | import java.io.IOException; |
097 | import java.net.HttpURLConnection; |
098 | import java.net.MalformedURLException; |
101 | import android.app.Activity; |
102 | import android.app.AlertDialog; |
103 | import android.content.DialogInterface; |
104 | import android.content.pm.PackageManager.NameNotFoundException; |
105 | import android.os.Bundle; |
106 | import android.view.View; |
107 | import android.view.View.OnClickListener; |
108 | import android.widget.Button; |
109 | import android.widget.Toast; |
112 | * UpdateTestActivity.java |
116 | public class UpdateTestActivity extends Activity { |
117 | private Button button; |
119 | public void onCreate(Bundle savedInstanceState) { |
120 | super .onCreate(savedInstanceState); |
121 | setContentView(R.layout.main); |
123 | button = (Button) findViewById(R.id.check); |
124 | button.setOnClickListener( new OnClickListener() { |
127 | public void onClick(View v) { |
130 | } catch (NameNotFoundException e) { |
140 | * @throws NameNotFoundException |
142 | private void checkVersion() throws NameNotFoundException{ |
143 | UpdateInfo updateInfo = new UpdateInfo(); |
147 | HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
149 | updateInfo = ParseXmlUtils.parseXml(connection.getInputStream()); |
151 | } catch (MalformedURLException e) { |
153 | } catch (IOException e) { |
156 | if (updateInfo.getVersion().equals(VersionUtil.getVersionName( this ))){ |
157 | Toast.makeText( this , "版本相同,不需要升级!" , Toast.LENGTH_SHORT).show(); |
160 | showUpdateDialog(updateInfo); |
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() { |
172 | public void onClick(DialogInterface dialog, int which) { |
176 | .setNegativeButton( "取消" , |
177 | new DialogInterface.OnClickListener() { |
180 | public void onClick(DialogInterface dialog, int which) { |
190 | 这里说明一下:远程服务器放置一个xml文件,用来说明当前新版本的信息。包括版本号,新版本功能说明,新版下载链接 |
198 | package com.cloay.update; |
200 | import java.io.IOException; |
201 | import java.io.InputStream; |
203 | import javax.xml.parsers.DocumentBuilder; |
204 | import javax.xml.parsers.DocumentBuilderFactory; |
205 | import javax.xml.parsers.ParserConfigurationException; |
207 | import org.w3c.dom.Document; |
208 | import org.w3c.dom.Element; |
209 | import org.w3c.dom.NodeList; |
210 | import org.xml.sax.SAXException; |
217 | public class ParseXmlUtils { |
223 | public static UpdateInfo parseXml(InputStream in){ |
224 | UpdateInfo updateInfo = new UpdateInfo(); |
225 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
226 | DocumentBuilder db = null ; |
228 | db = dbf.newDocumentBuilder(); |
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()); |
239 | } catch (ParserConfigurationException e) { |
241 | } catch (SAXException e) { |
243 | } catch (IOException e) { |
250 | package com.cloay.update; |
252 | import java.io.IOException; |
253 | import java.io.InputStream; |
255 | import javax.xml.parsers.DocumentBuilder; |
256 | import javax.xml.parsers.DocumentBuilderFactory; |
257 | import javax.xml.parsers.ParserConfigurationException; |
259 | import org.w3c.dom.Document; |
260 | import org.w3c.dom.Element; |
261 | import org.w3c.dom.NodeList; |
262 | import org.xml.sax.SAXException; |
269 | public class ParseXmlUtils { |
275 | public static UpdateInfo parseXml(InputStream in){ |
276 | UpdateInfo updateInfo = new UpdateInfo(); |
277 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
278 | DocumentBuilder db = null ; |
280 | db = dbf.newDocumentBuilder(); |
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()); |
291 | } catch (ParserConfigurationException e) { |
293 | } catch (SAXException e) { |
295 | } catch (IOException e) { |
305 | package com.cloay.update; |
312 | public class UpdateInfo { |
313 | private String version; |
315 | private String description; |
316 | public String getVersion() { |
319 | public void setVersion(String version) { |
320 | this .version = version; |
322 | public String getUrl() { |
325 | public void setUrl(String url) { |
328 | public String getDescription() { |
331 | public void setDescription(String description) { |
332 | this .description = description; |
335 | package com.cloay.update; |
342 | public class UpdateInfo { |
343 | private String version; |
345 | private String description; |
346 | public String getVersion() { |
349 | public void setVersion(String version) { |
350 | this .version = version; |
352 | public String getUrl() { |
355 | public void setUrl(String url) { |
358 | public String getDescription() { |
361 | public void setDescription(String description) { |
362 | this .description = description; |
368 | package com.cloay.update; |
370 | import android.content.Context; |
371 | import android.content.pm.PackageInfo; |
372 | import android.content.pm.PackageManager; |
373 | import android.content.pm.PackageManager.NameNotFoundException; |
381 | public class VersionUtil { |
387 | * @throws NameNotFoundException |
389 | public static String getVersionName(Context context) throws NameNotFoundException{ |
391 | PackageManager packageManager = context.getPackageManager(); |
393 | PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0 ); |
394 | return packageInfo.versionName; |
398 | package com.cloay.update; |
400 | import android.content.Context; |
401 | import android.content.pm.PackageInfo; |
402 | import android.content.pm.PackageManager; |
403 | import android.content.pm.PackageManager.NameNotFoundException; |
411 | public class VersionUtil { |
417 | * @throws NameNotFoundException |
419 | public static String getVersionName(Context context) throws NameNotFoundException{ |
421 | PackageManager packageManager = context.getPackageManager(); |
423 | PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0 ); |
424 | return packageInfo.versionName; |
428 | 其实整个过程并不是很麻烦,需要注释的地方都已详细注释了,就写那么多。有问题请留言大家一起交流学习! |