Android应用的自动升级、更新模块的实现.doc_第1页
Android应用的自动升级、更新模块的实现.doc_第2页
Android应用的自动升级、更新模块的实现.doc_第3页
Android应用的自动升级、更新模块的实现.doc_第4页
Android应用的自动升级、更新模块的实现.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新。得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下。首先给出界面效果:1. 准备知识在AndroidManifest.xml里定义了每个Android apk的版本标识:复制代码其中,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;复制代码同理,apk的应用名称可以这样获得:public static String getAppName(Context context) String verName = context.getResources() .getText(R.string.app_name).toString(); return verName;复制代码2. 流程框架3. 版本检查在服务端放置最新版本的apk文件,如:http:/localhost/myapp/myapp.apk同时,在服务端放置对应此apk的版本信息调用接口或者文件,如:http:/localhost/myapp/ver.jsonver.json中的内容为:appname:jtapp12,apkname:jtapp-12-updateapksamples.apk,verName:1.0.1,verCode:2复制代码然后,在手机客户端上进行版本读取和检查:private boolean getServerVer () 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; 复制代码比较服务器和客户端的版本,并进行更新操作。 if (getServerVerCode() int vercode = Config.getVerCode(this); / 用到前面第一节写的方法 if (newVerCode vercode) doNewVersionUpdate(); / 更新新版本 else notNewVersionShow(); / 提示当前为最新版本 复制代码详细方法:private void notNewVersionShow() int verCode = Config.getVerCode(this); String verName = Config.getVerName(this); StringBuffer sb = new StringBuffer(); sb.append(当前版本:); sb.append(verName); sb.append( Code:); sb.append(verCode); sb.append(,/n已是最新版,无需更新!); Dialog dialog = new AlertDialog.Builder(Update.this).setTitle(软件更新) .setMessage(sb.toString()/ 设置内容 .setPositiveButton(确定,/ 设置确定按钮 new DialogInterface.OnClickListener() Override public void onClick(DialogInterface dialog, int which) finish(); ).create();/ 创建 / 显示对话框 dialog.show(); private void doNewVersionUpdate() int verCode = Config.getVerCode(this); String verName = Config.getVerName(this); StringBuffer sb = new StringBuffer(); sb.append(当前版本:); sb.append(verName); sb.append( Code:); sb.append(verCode); sb.append(, 发现新版本:); sb.append(newVerName); sb.append( Code:); sb.append(newVerCode); sb.append(, 是否更新?); Dialog dialog = new AlertDialog.Builder(Update.this) .setTitle(软件更新) .setMessage(sb.toString() / 设置内容 .setPositiveButton(更新,/ 设置确定按钮 new DialogInterface.OnClickListener() Override public void onClick(DialogInterface dialog, int which) pBar = new ProgressDialog(Update.this); pBar.setTitle(正在下载); pBar.setMessage(请稍候.); pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME); ) .setNegativeButton(暂不更新, new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int whichButton) / 点击取消按钮之后退出程序 finish(); ).create();/ 创建 / 显示对话框 dialog.show(); 复制代码4. 下载模块注,本部分参考了前人的相关实现,/android-14576-1-1.html void downFile(final String url) pBar.show(); new Thread() public void run() HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response; try response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); FileOutputStream fileOutputStream = null; if (is != null) File file = new File( Environment.getExternalStorageDirectory(), Config.UPDATE_SAVENAME); fileOutputStream = new FileOutputStream(file); byte buf = new byte1024; int ch = -1; int count = 0; while (ch = is.read(buf) != -1) fileOutputStream.write(buf, 0, ch); count += ch; if (length 0) fileOutputStream.flush(); if (fileOutputStream != null) fileOutputStream.close(); down(); catch (ClientProtocolException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); .start(); 复制代码下载完成,通过handler通知主ui线程将下载对话框取消。void down() handler.post(new Runnable() public void run() pBar.cancel(); update(); );复制代码5. 安装应用 void update() Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment .getExternalStorageDirectory(), Config.UPDATE_SAVENAME), application/vnd.android.packa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论