很多Android应用都具有版本检测自动更新功能,用户一键就可以完成软件的升级更新。这得益于Android系统的软件包管理和安装机制,这一功能实现起来也很简单。
Android的apk版本信息的获取:
定义在androidmanifest.xml里
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.huazi.updateapksamples"
android:versionCode="1"
android:versionName=" 1.0.0">
<application ></application>
</manifest>
注意红色加粗字段,这个就是版本信息,其中versionCode常用来新旧版本的比较。
至于怎么在code里获取版本信息呢?
方法如下:
PackageInfo info = getPackageManager().getPackageInfo("com.huazi.mylive", 0);
String versionName = info.versionName;
int versionCode = info.versionCode;
关键源码说明:
1、 ver.json 用于服务器上软件版本检测
[{"appname":"updateapksamples","apkname":"updateapksamples.apk","verName":1.0.1,"verCode":2}]
2、服务器上版本获取,也即解析json
private boolean getServerVerCode() {
try {
String verjson = NetworkTool.getContent(Config.UPDATE_SERVER
+ Config.UPDATE_VERJSON);
JSONArray array = new JSONArray(verjson);
if (array.length() > 0) {
JSONObject obj = array.getJSONObject(0);
try {
newVerCode = Integer.parseInt(obj.getString("verCode"));
newVerName = obj.getString("verName");
} catch (Exception e) {
newVerCode = -1;
newVerName = "";
return false;
}
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
return false;
}
return true;
}
3、当前软件版本获取
public static int getVerCode(Context context) {
int verCode = -1;
try {
verCode = context.getPackageManager().getPackageInfo(
"com.huazi.updateapksamples", 0).versionCode;
} catch (NameNotFoundException e) {
Log.e(TAG, e.getMessage());
}
return verCode;
}
4. 下载模块
public class NetworkTool {
public static String getContent(String url) throws Exception{
StringBuilder sb = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpParams httpParams = client.getParams();
//设置网络超时参数
HttpConnectionParams.setConnectionTimeout(httpParams, 3000);
HttpConnectionParams.setSoTimeout(httpParams, 5000);
HttpResponse response = client.execute(new HttpGet(url));
HttpEntity entity = response.getEntity();
if (entity != null) {BufferedReader reader = new BufferedReader(
new InputStreamReader(entity.getContent(), "UTF-8"), 8192);
String line = null;
while ((line = reader.readLine())!= null){
sb.append(line + "\n");
}
reader.close();
}
return sb.toString();
}
}
下面,进行版本检测更新的测试!
1.修改andriodmanifest.xml
android:versionCode="2"
android:versionName="1.0.1"
修改string.xml
<string name="hello">Hello World, UpdateActivity! new !</string>
编译出apk到d:/myapp/ updateapksamples.apk
2.在d:/myapp/下建立ver.json,内容如下:
[{"appname":"updateapksamples","apkname":"updateapksamples.apk","verName":1.0.1,"verCode":2}]
3.为d:/myapp配置一个tomcat的工作目录
方法如下:tomcat目录/conf/ server.xml的host字段增加红色部分
<Host name="localhost" appBase="webapps"
unpackWARs="true" >
<Context path="/mp3" docBase="D:/mp3"></Context>
<Context path="/myapp" docBase="D:/myapp"></Context>
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
测试配置结果:
Android <wbr>apk版本检测及更新
4. 修改andriodmanifest.xml
android:versionCode="1"
android:versionName="1.0.0"
修改string.xml
<string name="hello">Hello World, UpdateActivity! </string>
模拟器上运行:(运行结果)
Android <wbr>apk版本检测及更新
弹出对话框,说明软件版本检测成功!
5. 选择更新,在下载成功后,会提示replace application,选择OK,安装新版本apk,
然后运行新版本的apk,如下:
Android <wbr>apk版本检测及更新
可以看到显示的字串后面多了内容 new!
版本内容也是服务器上的apk的版本信息,说明软件更新成功!