本案例分为服务器端 客户端 服务端: 使用MyEclipse 搭建的java Web项目 功能:当客户端请求服务器时,返回json数据 项目目录:
注意:jar包必须都得导入,否则会出错,都是相互依赖的。 主要功能代码:InstallAction.java publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //在服务器上设置好文件的存放路径 StringapkUrl="http://192.168.1.101:8080/InstallJson/Android_install.apk"; PrintWriterprintWriter=response.getWriter(); Messagemessage=newMessage();//声明一个实体类并写赋值 message.setVersionCode(2); message.setApkUrl(apkUrl); //生成map对象,设置数据message Map<String,Object>map=newHashMap<String,Object>(); map.put("message",message); //利用JSONSerializer.toJSON(map)输出json数据格式 printWriter.println(JSONSerializer.toJSON(map)); printWriter.flush();//推出 printWriter.close();//关闭 } Message.java publicclassMessage{ privateintversionCode; privateStringapkUrl; publicintgetVersionCode(){ returnversionCode; } publicvoidsetVersionCode(intversionCode){ this.versionCode=versionCode; } publicStringgetApkUrl(){ returnapkUrl; } publicvoidsetApkUrl(StringapkUrl){ this.apkUrl=apkUrl; } 客户端: 功能:启动时自动检测更新,如果更新则下载->安装到手机 项目目录结构:
PackageUtils:操作PackageManager,得到清单的一些信息 PackageManager:
java.lang.Object
android.content.pm.PackageManager

public abstractPackageManagergetPackageManager()

Added in API level 1

Return PackageManager instance to find global package information.

得到关于管理设备的对象PackageManager调用PackageManager的getPackageManageer()获得PackageInfo对象,

在PackageInfo对象中获取信息

oldVersionCode=packageUtils.getVersionCode();//定义的获取本地版本code

判断是否更新方法://是否更新

publicbooleanisUpdate(intoldCode,intnewCode){ booleanflag=oldCode<newCode?true:false; returnflag; } 在程序运行的时候,开一个异步任务,用来检测版本code是否一致。 install=newreadJsonTask().execute(path).get();直接返回一个install对象,
newVersonCode = install .getVersionCode();//新的版本 //判断 if(packageUtils.isUpdate(oldVersionCode,newVersonCode)){ dispplayAlert(); alert.show(); } publicclassreadJsonTaskextendsAsyncTask<String,Void,Install> 在访问服务器的异步任务中,参数分别是:地址、无、Install对象(得到code和版本信息) HttpUtils /** *Http操作工具类: *定义获取getInstallJson方法来获取json数据, *@parampath参数为请求地址 *@return返回String字符串jsonString */ publicstaticStringgetInstallJson(Stringpath){ StringjsonString=null; HttpClienthttpClient=newDefaultHttpClient(); try{ HttpGethttpGet=newHttpGet(path); HttpResponsers=httpClient.execute(httpGet);//执行操作并获取HttpResponse对象(包含获取的内容数据) if(rs.getStatusLine().getStatusCode()==200){ jsonString=EntityUtils.toString(rs.getEntity());//得到Sting } }catch(ClientProtocolExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } returnjsonString; } /** *parseJson方法解析json数据 *@paramjson参数为jsons字符串 *@return返回一个Instaljavabean实体类 */ publicstaticInstallparseJson(Stringjson){ Installinstall=newInstall();//声明javabean为对象赋值 try{ JSONObjectjsonObject=newJSONObject(json) .getJSONObject("message"); install.setVersionCode(jsonObject.getInt("versionCode")); install.setVersionUrl(jsonObject.getString("apkUrl")); }catch(JSONExceptione){ e.printStackTrace(); } returninstall; } /** *下载新版本Apk *@parampath下载路径 *@paramfileName文件名称 *@return返回存储路径(用来写入SD卡) */ publicstaticStringdownloadApk(Stringpath,StringfileName){ byte[]data=null; Stringstate=Environment.getExternalStorageState();//sd卡的状态 Fileroot=Environment.getExternalStorageDirectory();//根目录 FileOutputStreamoutputStream=null; HttpClienthttpClient=newDefaultHttpClient(); try{ HttpGethttpGet=newHttpGet(path); HttpResponsers=httpClient.execute(httpGet); if(rs.getStatusLine().getStatusCode()==200){ data=EntityUtils.toByteArray(rs.getEntity()); //判断是否可写入sd if(state.equals(Environment.MEDIA_MOUNTED)){ outputStream=newFileOutputStream( newFile(root,fileName)); outputStream.write(data,0,data.length); } } }catch(ClientProtocolExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }finally{ if(outputStream!=null){ try{ outputStream.close(); }catch(IOExceptione){ e.printStackTrace(); } } } returnroot.getAbsolutePath()+"/"+fileName; } MainActivity:主activity //安装apk应用传入一个file文件路径 privatevoidopenFile(Filefile){ Intentintent=newIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent); }
AndroidTest:单元测试 程序代码:下载 程序截图:未完待续

更多相关文章

  1. ReactNative 中 android按两次返回键退出当前应用程序
  2. Android(安卓)WebView中无法用JS调用Java对象的问题
  3. Android如何获取SDCard 内存
  4. android 网络编程 HttpGet类和HttpPost类使用详解
  5. android打开相册选取图片或打开相机拍照并进行裁剪
  6. Android黑群出品:SQLite数据库的使用和升级
  7. Android(安卓)Studio创建Serializable对象时自动生成serialVersi
  8. 2016~4.12Android(安卓)之图片处理
  9. Android控制软键盘的现实与隐藏

随机推荐

  1. [Android1.6]继承BaseAdapter为GridView
  2. Android(安卓)NDK 教程 - NDK环境配置和
  3. 3.3详解四种基本布局
  4. Android(安卓)项目实例config.gradle配置
  5. Android中WebView和JavaScript通信
  6. android dns设置(无法解析域名问题)
  7. 2011.10.19(3)——— android 一个便签的Wi
  8. Android多种方法获取系统时间
  9. Android多种数据库存储方式对比
  10. gdb 远程调试android进程