|
Android 应用程序自动更新源码 可用于phonegap
Android 应用程序自动更新源码 基本信息
源码分类:网络浏览
更新时间:2012-08-19
源码大小:0.13 MB
适用平台:Android2.2+
Android 应用程序自动更新源码简介
我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新。得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下。首先给出界面效果:
1.准备知识
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myapp"
android:versionCode="1"
android:versionName="1.0.0">
<application></application>
</manifest
>
其中,android:versionCode和android:versionName两个字段分别表示版本代码,版本名称。versionCode是整型数字,versionName是字符串。由于version是给用户看的,不太容易比较大小,升级检查时,可以以检查versionCode为主,方便比较出版本的前后大小。
那么,在应用中如何读取AndroidManifest.xml中的versionCode和versionName呢?可以使用PackageManager的API,参考以下代码:
public static int getVerCode(Context context) {
int verCode = -1;
try {
verCode = context.getPackageManager().getPackageInfo(
"com.myapp", 0).versionCode;
} catch (NameNotFoundException e) {
Log.e(TAG, e.getMessage());
}
return verCode;
}
public static String getVerName(Context context) {
String verName = "";
try {
verName = context.getPackageManager().getPackageInfo(
"com.myapp", 0).versionName;
} catch (NameNotFoundException e) {
Log.e(TAG, e.getMessage());
}
return verName;
}
或者在AndroidManifest中将android:versionName="1.2.0"写成android:versionName="@string/app_versionName",然后在values/strings.xml中添加对应字符串,这样实现之后,就可以使用如下代码获得版本名称:
public static String getVerName(Context context) {
String verName = context.getResources()
.getText(R.string.app_versionName).toString();
return verName;
}
流程框架
3. 版本检查
在服务端放置最新版本的apk文件,如:http://localhost/myapp/myapp.apk
同时,在服务端放置对应此apk的版本信息调用接口或者文件,如:http://localhost/myapp/ver.json
ver.json中的内容为:
[{"appname":"jtapp12","apkname":"jtapp-12-updateapksamples.apk","verName":1.0.1,"verCode":2}]
然后,在手机客户端上进行版本读取和检查:
- 01
- private boolean getServerVer () {
- 02
- try {
- 03
- String verjson = NetworkTool.getContent(Config.UPDATE_SERVER
- 04
- + Config.UPDATE_VERJSON);
- 05
- JSONArray array = new JSONArray(verjson);
- 06
- if (array.length() > 0) {
- 07
- JSONObject obj = array.getJSONObject(0);
- 08
- try {
- 09
- newVerCode = Integer.parseInt(obj.getString("verCode"));
- 10
- newVerName = obj.getString("verName");
- 11
- } catch (Exception e) {
- 12
- newVerCode = -1;
- 13
- newVerName = "";
- 14
- return false;
- 15
- }
- 16
- }
- 17
- } catch (Exception e) {
- 18
- Log.e(TAG, e.getMessage());
- 19
- return false;
- 20
- }
- 21
- return true;
- 22
- }
复制代码
比较服务器和客户端的版本,并进行更新操作。
- 1
- if (getServerVerCode()) {
- 2
- int vercode = Config.getVerCode(this); // 用到前面第一节写的方法
- 3
- if (newVerCode > vercode) {
- 4
- doNewVersionUpdate(); // 更新新版本
- 5
- } else {
- 6
- notNewVersionShow(); // 提示当前为最新版本
- 7
- }
- 8
- }
- 详细方法:
- 01
- private void notNewVersionShow() {
- 02
- int verCode = Config.getVerCode(this);
- 03
- String verName = Config.getVerName(this);
- 04
- StringBuffer sb = new StringBuffer();
- 05
- sb.append("当前版本:");
- 06
- sb.append(verName);
- 07
- sb.append(" Code:");
- 08
- sb.append(verCode);
- 09
- sb.append(",
- 10
- 已是最新版,无需更新!");
- 11
- Dialog dialog = new AlertDialog.Builder(Update.this).setTitle("软件更新")
- 12
- .setMessage(sb.toString())// 设置内容
- 13
- .setPositiveButton("确定",// 设置确定按钮
- 14
- new DialogInterface.OnClickListener() {
- 15
- @Override
- 16
- public void onClick(DialogInterface dialog,
- 17
- int which) {
- 18
- finish();
- 19
- }
- 20
- }).create();// 创建
- 21
- // 显示对话框
- 22
- dialog.show();
- 23
- }
- 24
- private void doNewVersionUpdate() {
- 25
- int verCode = Config.getVerCode(this);
- 26
- String verName = Config.getVerName(this);
- 27
- StringBuffer sb = new StringBuffer();
- 28
- sb.append("当前版本:");
- 29
- sb.append(verName);
- 30
- sb.append(" Code:");
- 31
- sb.append(verCode);
- 32
- sb.append(", 发现新版本:");
- 33
- sb.append(newVerName);
- 34
- sb.append(" Code:");
- 35
- sb.append(newVerCode);
- 36
- sb.append(", 是否更新?");
- 37
- Dialog dialog = new AlertDialog.Builder(Update.this)
- 38
- .setTitle("软件更新")
- 39
- .setMessage(sb.toString())
- 40
- // 设置内容
- 41
- .setPositiveButton("更新",// 设置确定按钮
- 42
- new DialogInterface.OnClickListener() {
- 43
- @Override
- 44
- public void onClick(DialogInterface dialog,
- 45
- int which) {
- 46
- pBar = new ProgressDialog(Update.this);
- 47
- pBar.setTitle("正在下载");
- 48
- pBar.setMessage("请稍候...");
- 49
- pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
- 50
- downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME);
- 51
- }
- 52
- })
- 53
- .setNegativeButton("暂不更新",
- 54
- new DialogInterface.OnClickListener() {
- 55
- public void onClick(DialogInterface dialog,
- 56
- int whichButton) {
- 57
- // 点击"取消"按钮之后退出程序
- 58
- finish();
- 59
- }
- 60
- }).create();// 创建
- 61
- // 显示对话框
- 62
- dialog.show();
- 63
- }
复制代码
4.下载模块
- 01
- void downFile(final String url) {
- 02
- pBar.show();
- 03
- new Thread() {
- 04
- public void run() {
- 05
- HttpClient client = new DefaultHttpClient();
- 06
- HttpGet get = new HttpGet(url);
- 07
- HttpResponse response;
- 08
- try {
- 09
- response = client.execute(get);
- 10
- HttpEntity entity = response.getEntity();
- 11
- long length = entity.getContentLength();
- 12
- InputStream is = entity.getContent();
- 13
- FileOutputStream fileOutputStream = null;
- 14
- if (is != null) {
- 15
- File file = new File(
- 16
- Environment.getExternalStorageDirectory(),
- 17
- Config.UPDATE_SAVENAME);
- 18
- fileOutputStream = new FileOutputStream(file);
- 19
- byte[] buf = new byte[1024];
- 20
- int ch = -1;
- 21
- int count = 0;
- 22
- while ((ch = is.read(buf)) != -1) {
- 23
- fileOutputStream.write(buf, 0, ch);
- 24
- count += ch;
- 25
- if (length > 0) {
- 26
- }
- 27
- }
- 28
- }
- 29
- fileOutputStream.flush();
- 30
- if (fileOutputStream != null) {
- 31
- fileOutputStream.close();
- 32
- }
- 33
- down();
- 34
- } catch (ClientProtocolException e) {
- 35
- e.printStackTrace();
- 36
- } catch (IOException e) {
- 37
- e.printStackTrace();
- 38
- }
- 39
- }
- 40
- }.start();
- 41
- }
复制代码
下载完成,通过handler通知主ui线程将下载对话框取消。
- 1
- void down() {
- 2
- handler.post(new Runnable() {
- 3
- public void run() {
- 4
- pBar.cancel();
- 5
- update();
- 6
- }
- 7
- });
- 8
- }
- 5.安装应用
- 1
- void update() {
- 2
- Intent intent = new Intent(Intent.ACTION_VIEW);
- 3
- intent.setDataAndType(Uri.fromFile(new File(Environment
- 4
- .getExternalStorageDirectory(), Config.UPDATE_SAVENAME)),
- 5
- "application/vnd.android.package-archive");
- 6
- startActivity(intent);
- 7
- }
复制代码
Android 应用程序自动更新源码 可用于phonegap源码下载
Android 应用程序自动更新源码.zip
(200.98 KB, 下载次数: 135)
|
|