在Android开发中,许多开发者都会遇到如何让应用程序自动更新的问题,也就是需要让应用程序自动发现服务器上的新版本然后提示更新,当用户点击确定后就下载新版本的应用程序,下载完毕后自动安装更新新程序。
关于这个主要的流程是这样的:程序启动 --> 在适当的时候后台检查更新 --> 链接远程服务器 --> 获取服务器端新版本信息 --> 比对当前版本 --> 判断是否有更新,如果有有 --> 显示更新提示对话框并显示更新提示内容 --> 交与用户选择是否立即更新。
这个功能的实现需要在服务器端放置一个xml文件,xml文件主要用来说明当前版本信息,包括版本号,发布时间,版本功能
介绍等信息。下面是一个例子:
新版本描述信息
1.uptInfo实体类,这个实体类对应于服务器端的xml文件,当程序检测是否有新版本时,首先从服务器下载xml文件后,会将这个xml文件内的信息解析到这个实体类中,参考代码如下:
public class UptInfo {
private String version; // 版本号
private String url; // 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 description) {
this.description = description;
}
}
2.解析xml代码的工具类(这个类主要将从服务器端下载的xml解析到uptInfo实体类中),参考代码如下:
public class ParseXmlUtils {
//解析xml文件
public static UptInfo parseXml(InputStream in) {
UptInfo uptInfo = new UptInfo();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
db = dbf.newDocumentBuilder();
Document doc = null;
doc = db.parse(in);
Element root = doc.getDocumentElement();
NodeList resultNode = root.getElementsByTagName("info");
for (int i = 0; i < resultNode.getLength(); i++) {
Element res = (Element) resultNode.item(i);
uptInfo.setVersion(res.getElementsByTagName("version")
.item(0).getFirstChild().getNodeValue());
uptInfo.setUrl(res.getElementsByTagName("url").item(0)
.getFirstChild().getNodeValue());
uptInfo.setDescription(res
.getElementsByTagName("description").item(0)
.getFirstChild().getNodeValue());
}
return upInfo;
}
}
3.VersionUtil类,这个类主要用来获取当前已安装的安卓应用程序的版本信息,主要用来与服务器端的xml中的版本信息对比判断是否提示更新,参考代码如下:
public class VersionUtil {
//获取版本号
public static String getCurVersion(Context context)
throws NameNotFoundException {
// 获取PackageManager 实例
PackageManager packageManager = context.getPackageManager();
// 获得context所属类的包名,0表示获取版本信息
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
return packageInfo.versionName;
}
}
4.主程序代码:
public class AutoUptDemoActivity extends Activity {
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.check);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
checkVersion();
}
});
}
//检查是否需要更新程序
private void checkVersion() throws NameNotFoundException {
UptInfo uptInfo = new UptInfo();
URL url;
url = new URL(http://192.168.0.150:8080/update.xml);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
uptInfo = ParseXmlUtils.parseXml(connection.getInputStream());
if (uptInfo.getVersion().equals(VersionUtil.getCurVersion(this))) {
Toast.makeText(this, "版本相同,不需要升级!", Toast.LENGTH_SHORT).show();
} else {
showUpdateDialog(uptInfo);
}
}
private void showUpdateDialog(UptInfo uptInfo) {
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setTitle("提示检测到新版本,确定升级吗?").setIcon(R.drawable.ask)
.setMessage(uptInfo.getDescription())
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel(); //此处下载新版程序文件并安装,本文已经很长,这里不再赘述
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}).create();
alertDialog.show();
}
}
想要了解更多有关android开发的知识可以查询天地会。