二. 检查版本号
1. 检查版本号线程
流程 :
a. 保持Splash持续时间 : 获取当前时间与time进行比较, 如果不足3秒, 人为使Splash保持3秒时间;
b. 查看更新设置 : 从sp中获取更新设置, 如果sp中自动更新为true, 那么就执行下面的更新流程, 如果sp中自动更新为false, 那么直接进入主界面.
c. 获取信息 : 从网络中获取更新信息, 根据是否成功获取信息执行不同的操作.
源码 :
private final class CheckVersionTask implements Runnable{ public void run() { try { /* * 获取当前时间, 与onCreate方法中获取的时间进行比较 * 如果不足3秒, 在等待够3秒之后在执行下面的操作 */ long temp = System.currentTimeMillis(); if(temp - time < 3000){ SystemClock.sleep(temp - time); } /* * 检查配置文件中的设置, 是否设置了自动更新; * 如果设置了自动更新, 就执行下面的操作, * 如果没有设置自动更新, 就直接进入主界面 */ boolean is_auto_update = sp.getBoolean("is_auto_update", true); if(!is_auto_update){ loadMainUI(); return; } /* * 获取更新信息 * 如果信息不为null, 向handler发信息SUCESS_GET_UPDATEINOF, 执行后续操作 * 如果信息为null, 向handler发信息ERROR_GET_UPDATEINOF, 执行后续操作 * 如果出现异常, 向handler发信息ERROR_GET_UPDATEINOF, 执行后续操作 */ updateInfo = getUpdateInfo(SettingsFactory.readWebLoadUrl(getApplicationContext()) + UPDATE_FOLDER_DIRECTORY + XML_FILE_DIRECTORY); if(updateInfo != null){ Message msg = new Message(); msg.what = SUCESS_GET_UPDATEINOF; mHandler.sendMessage(msg); }else{ Message msg = new Message(); msg.what = ERROR_GET_UPDATEINOF; mHandler.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); Message msg = new Message(); msg.what = ERROR_GET_UPDATEINOF; mHandler.sendMessage(msg); } } }
2. 获取版本号方法
流程 :
a. 创URL建对象;
b. 创建HttpURLConnection对象;
c. 设置超时时间;
d. 设置获取方式;
e. 查看链接是否成功;
f. 解析输入流信息;
源码 :
/** * 获取更新信息 * ① 根据字符串地址创建URL对象 * ② 根据URL对象创建HttpURLConnection链接对象 * ③ 设置链接对象5秒超时 * ④ 设置链接对象获取的方式为get方式 * ⑤ 如果成功连接, conn.getRequestCode值就是200, 此时就可以获取输入流 * ⑥ 解析输入流获取更新信息 * */ private UpdateInfo getUpdateInfo(String path){ try { URL url = new URL(path); //创建URL对象 //创建连接对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置链接超时 conn.setConnectTimeout(5000); //设置获取方式 conn.setRequestMethod("GET"); //如果连接成功, 获取输入流 if(conn.getResponseCode() == 200){ InputStream is = conn.getInputStream(); //解析输入流中的数据, 返回更新信息 return parserUpdateInfo(is); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
3. 更新信息对象
将从网上获取的更新信息 包括 版本号, apk文件地址, 软件描述等信息封装在一个类中.
public class UpdateInfo { private String version; //当前软件版本号 private String 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; } @Override public String toString() { return "UpdateInfo [version=" + version + ", url=" + url + ", description=" + description + "]"; } }
4. pull解析输入流
(1) pull解析流程
a. 获取pull解析器 : XmlPullParser parser = Xml.newPullParser();
b. 为pull解析器设置编码 : parser.setInput(inputStream, "UTF-8");
c. 获取pull解析器事件 : int eventType = parser.getEventType(), 之后的解析都要根据这个解析事件进行, 例如开始解析标签的事件时 XmlPullParser.START_TAG, 文档结束的事件时 XmlPullParser.END_DOCUMENT.
d. 解析流程控制 : 解析的时候, 如果没有解析到文档最后就一直解析, 这里使用while循环, eventType != XmlPullParser.END_DOCUMENT 就一直循环, 循环玩一个元素之后, 调用parser.next()遍历下一个元素.
e. 获取标签名 : 在事件解析标签的时候 ( eventType == XmlPullParser.START_TAG ) , 调用parser.getName()可以获取这个标签的标签名, 如果我们想要获取这个标签下的文本元素, 可以使用parser.nextText()来获取.
(2) 更新xml文件
<?xml version="1.0" encoding="UTF-8"?> <updateInfo> <version>3.2</version> <url>http://127.0.0.1:8080/web/mobilesafe.apk</url> <description>客户端更新</description> </updateInfo>
(3) 源码
/** * 获取更新信息 * ① 创建pull解析器 * ② 为解析器设置编码格式 * ③ 获取解析事件 * ④ 遍历整个xml文件节点, 获取标签元素内容 */ private UpdateInfo parserUpdateInfo(InputStream is){ try { UpdateInfo updateInfo = null; //1. 创建pull解析解析器 XmlPullParser parser = Xml.newPullParser(); //2. 设置解析编码 parser.setInput(is, "UTF-8"); //3. 获取解析器解事件, 如解析到文档开始 , 结尾, 标签等 int eventType = parser.getEventType(); //4. 在文档结束前一直解析 while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { //只解析标签 case XmlPullParser.START_TAG: if ("updateInfo".equals(parser.getName())) { //当解析到updateInfo标签的时候, 跟标签开始, 创建一个UpdateInfo对象 updateInfo = new UpdateInfo(); } else if ("version".equals(parser.getName())) { //解析版本号标签 updateInfo.setVersion(parser.nextText()); } else if ("url".equals(parser.getName())) { //解析url标签 updateInfo.setUrl(parser.nextText()); } else if ("description".equals(parser.getName())) { //解析描述标签 updateInfo.setDescription(parser.nextText()); } break; default: break; } //每解析完一个元素, 就将解析标志位下移 eventType = parser.next(); } is.close(); return updateInfo; } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
三. Handler对象
Handler对象用来控制整个更新过程的进行;
.