edit_note帖子
516
stars积分
16,472
event加入
2011-10-15
怀旧国机
[教程]Android实现程序的自动(马上续贴)
schedule发表于 2012-10-31 07:05:00
visibility查看 413
chat_bubble回复 12
#1 楼主
一个良好的android程序都应该有版本的更新,那怎样实现更新呢?今天就为大家介绍应用自动更新的全过程。程序自动更新的流程大致如下:程序启动 -> 适时后台检查更新 -> 链接远程服务器 -> 获取新版本信息-> 比对当前版本 -> if(有更新) -> 显示更新提示对话框并显示更新的内容 -> 交与用户选择下面是我做的一个简单demo,大家可以参考一下:布局比较简单就不上代码了。主程序代码:
package com.cloay.*;import java.io.ioexception;import java.net.httpurlconnection;import java.net.malformedurlexception;import java.net.url;import android.app.activity;import android.app.alertdialog;import android.content.dialoginterface;
package com.cloay.*;import java.io.ioexception;import java.net.httpurlconnection;import java.net.malformedurlexception;import java.net.url;import android.app.activity;import android.app.alertdialog;import android.content.dialoginterface;
package com.cloay.*;import java.io.ioexception;import java.net.httpurlconnection;import java.net.malformedurlexception;import java.net.url;import android.app.activity;import android.app.alertdialog;import android.content.dialoginterface;
import android.content.pm.packagemanager.namenotfoundexception;import android.os.bundle;import android.view.import android.view.view.onclicklistener;import android.widget.button;import android.widget.toast;
/*** 程序自动更新 *testactivity.java** @author cloay 2011-11-23*/public class *testactivity extends activity {private button button;@overridepublic void on*(bundle savedinstancestate) {super.on*(savedinstancestate);setcontentview(r.layout.main);button = (button
k);button.setonclicklistener(new onclicklistener() {@overridepublic void onclick(view v) {checkversion();} catch (namenotfoundexception e) {// todo auto-generated catch blocke.printstacktrace();}}});}/*** 检查是否需要更新程序*
* @throws namenotfoundexception*/private void checkversion() throws namenotfoundexception {** ** = new **();url url;try {url = new url(“http://localhost:8080/*.xml“);httpurlconnection connection = (httpurlconnection) url.openconnection();// conne
n.getinputstream());} catch (malformedurlexception e) {e.printstacktrace();} catch (ioexception e) {e.printstacktrace();}if (**.getversion().equals(versionutil.getversionname(this))) {toast.maketext(this, “版本相同,不需要升级!“, toast.length_
short).show();} else {show*dialog(**);}}private void show*dialog(** **) {alertdialog alertdialog = new alertdialog.builder(this).settitle(“提示检测到新版本,确定升级吗?“).seticon(r.drawable.ask).setmessage(**.getdescription()).setpositivebutton(“确定“,
new dialoginterface.onclicklistener() {@overridepublic void onclick(dialoginterface dialog, int which) {dialog.cancel();}}).setnegativebutton(“取消“, new dialoginterface.onclicklistener() {
@overridepublic void onclick(dialoginterface dialog, int which) {dialog.cancel()br]}}).*();alertdialog.show();}}这里说明一下:远程服务器放置一个xml文件,用来说明当前新版本的信息。包括版本号,新版本功能说明,新版下载链接。xml解析工具代码:package com.cloay.*;import java.io.ioexc
eption;import java.io.inputstream;import javax.xml.parsers.documentbuilder;import javax.xml.parsers.documentbuilderfactory;import javax.xml.parsers.parserconfigurationexception;import org.w3c.dom.document;
import org.w3c.dom.element;import org.w3c.dom.nodelist;import org.xml.sax.saxexception;/*** 解析xml文件 parsexmlutils.java** @author cloay 2011-11-7*/public class parsexm
lutils {/*** 通过inputstream 解析文件** @param in* @return*/public static ** parsexml(inputstream in) {** ** = new **();documentbuilderfactory dbf = documentbuilderfactory.newinstance();documentbuilder db = null;try {db = dbf.newdocumentbuilder();
document doc = null;doc = db.parse(in);element root = doc.getdocumentelement();nodelist resultnode = root.getelementsbytagname(“*“);for (int i = 0; i < resultnode.getlength(); i++) {element res = (element) resultnode.item(i);**.setversion(res
.getelementsbytagname(“version“).item(0).getfirstchild().getnod*ue());**.seturl(res.getelementsbytagname(“url“).item(0)
.getfirstchild().getnod*ue());}} catch (parserconfigurationexception e) {e.printstacktrace();
} catch (saxexception e) {e.printstacktrace();} catch (ioexception e) {e.printstacktrace();}return **;}}**实体:package com.cloay.*;/*** 更新信息实体类 **.java** @author cloay 2011-11-23*/public class ** {private string version; // 版本号
// 新版本存放url路径private string description; // 更新说明信息,比如新增什么功能特性等public string getversion() {return version;}public void setversion(string version) {this.version = version;}
public string geturl() {return url;}public void seturl(string url) {this.url = url;}public string getdescription() {return description;}public void setdescription(string descri
ption) {this.description = description;}}获取当前已安装版本信息:package com.cloay.*;import android.content.context;import android.content.pm.package*;import android.content.pm.packagemanager;
import android.content.pm.packagemanager.namenotfoundexception;/*** 版本工具类 versionutil.java** @author cloay 2011-11-23*/public class versionutil {/**
* 获取版本号** @param context* 上下文* @return* @throws namenotfoundexception*/public static string getversionname(context context)throws namenotfoundexception {// 获取packagemanager 实例packagemanager packagemanager = context.getpackagemanager();// 获得context所属类
的包名,0表示获取版本信息package* package* = packagemanager.getpackage*(context.getpackagename(), 0);return package*.versionname;}}整个过程并不麻烦,许多地方已经详细注释了,就写那么多。第 1/3 页,共 3 页
package com.cloay.*;import java.io.ioexception;import java.net.httpurlconnection;import java.net.malformedurlexception;import java.net.url;import android.app.activity;import android.app.alertdialog;import android.content.dialoginterface;
package com.cloay.*;import java.io.ioexception;import java.net.httpurlconnection;import java.net.malformedurlexception;import java.net.url;import android.app.activity;import android.app.alertdialog;import android.content.dialoginterface;
package com.cloay.*;import java.io.ioexception;import java.net.httpurlconnection;import java.net.malformedurlexception;import java.net.url;import android.app.activity;import android.app.alertdialog;import android.content.dialoginterface;
import android.content.pm.packagemanager.namenotfoundexception;import android.os.bundle;import android.view.import android.view.view.onclicklistener;import android.widget.button;import android.widget.toast;
/*** 程序自动更新 *testactivity.java** @author cloay 2011-11-23*/public class *testactivity extends activity {private button button;@overridepublic void on*(bundle savedinstancestate) {super.on*(savedinstancestate);setcontentview(r.layout.main);button = (button
k);button.setonclicklistener(new onclicklistener() {@overridepublic void onclick(view v) {checkversion();} catch (namenotfoundexception e) {// todo auto-generated catch blocke.printstacktrace();}}});}/*** 检查是否需要更新程序*
* @throws namenotfoundexception*/private void checkversion() throws namenotfoundexception {** ** = new **();url url;try {url = new url(“http://localhost:8080/*.xml“);httpurlconnection connection = (httpurlconnection) url.openconnection();// conne
n.getinputstream());} catch (malformedurlexception e) {e.printstacktrace();} catch (ioexception e) {e.printstacktrace();}if (**.getversion().equals(versionutil.getversionname(this))) {toast.maketext(this, “版本相同,不需要升级!“, toast.length_
short).show();} else {show*dialog(**);}}private void show*dialog(** **) {alertdialog alertdialog = new alertdialog.builder(this).settitle(“提示检测到新版本,确定升级吗?“).seticon(r.drawable.ask).setmessage(**.getdescription()).setpositivebutton(“确定“,
new dialoginterface.onclicklistener() {@overridepublic void onclick(dialoginterface dialog, int which) {dialog.cancel();}}).setnegativebutton(“取消“, new dialoginterface.onclicklistener() {
@overridepublic void onclick(dialoginterface dialog, int which) {dialog.cancel()br]}}).*();alertdialog.show();}}这里说明一下:远程服务器放置一个xml文件,用来说明当前新版本的信息。包括版本号,新版本功能说明,新版下载链接。xml解析工具代码:package com.cloay.*;import java.io.ioexc
eption;import java.io.inputstream;import javax.xml.parsers.documentbuilder;import javax.xml.parsers.documentbuilderfactory;import javax.xml.parsers.parserconfigurationexception;import org.w3c.dom.document;
import org.w3c.dom.element;import org.w3c.dom.nodelist;import org.xml.sax.saxexception;/*** 解析xml文件 parsexmlutils.java** @author cloay 2011-11-7*/public class parsexm
lutils {/*** 通过inputstream 解析文件** @param in* @return*/public static ** parsexml(inputstream in) {** ** = new **();documentbuilderfactory dbf = documentbuilderfactory.newinstance();documentbuilder db = null;try {db = dbf.newdocumentbuilder();
document doc = null;doc = db.parse(in);element root = doc.getdocumentelement();nodelist resultnode = root.getelementsbytagname(“*“);for (int i = 0; i < resultnode.getlength(); i++) {element res = (element) resultnode.item(i);**.setversion(res
.getelementsbytagname(“version“).item(0).getfirstchild().getnod*ue());**.seturl(res.getelementsbytagname(“url“).item(0)
.getfirstchild().getnod*ue());}} catch (parserconfigurationexception e) {e.printstacktrace();
} catch (saxexception e) {e.printstacktrace();} catch (ioexception e) {e.printstacktrace();}return **;}}**实体:package com.cloay.*;/*** 更新信息实体类 **.java** @author cloay 2011-11-23*/public class ** {private string version; // 版本号
// 新版本存放url路径private string description; // 更新说明信息,比如新增什么功能特性等public string getversion() {return version;}public void setversion(string version) {this.version = version;}
public string geturl() {return url;}public void seturl(string url) {this.url = url;}public string getdescription() {return description;}public void setdescription(string descri
ption) {this.description = description;}}获取当前已安装版本信息:package com.cloay.*;import android.content.context;import android.content.pm.package*;import android.content.pm.packagemanager;
import android.content.pm.packagemanager.namenotfoundexception;/*** 版本工具类 versionutil.java** @author cloay 2011-11-23*/public class versionutil {/**
* 获取版本号** @param context* 上下文* @return* @throws namenotfoundexception*/public static string getversionname(context context)throws namenotfoundexception {// 获取packagemanager 实例packagemanager packagemanager = context.getpackagemanager();// 获得context所属类
的包名,0表示获取版本信息package* package* = packagemanager.getpackage*(context.getpackagename(), 0);return package*.versionname;}}整个过程并不麻烦,许多地方已经详细注释了,就写那么多。第 1/3 页,共 3 页
全部回复 (12)
2012-10-31 07:09:00
沙发
000000000000000000000000000
2012-10-31 07:13:00
板凳
→_→下咯的
2012-10-31 07:19:00
地板
咳咳
2012-10-31 08:34:00
#5
乙型号码头
2012-10-31 08:41:00
#6
KTVK金考虑
2012-10-31 12:06:00
#7
....
2012-10-31 17:04:00
#8
dfg
2012-10-31 20:01:00
#9
透漏木事
2012-11-01 12:48:00
#10
你好,不错
2012-11-01 23:33:00
#11
看看
2012-11-02 22:22:00
#12
阿阿阿
2014-09-06 21:12:00
#13
i*
登录 后才能回复
flag举报帖子