手机安全卫士学习之APK检查自动升级
来源:互联网 发布:淘宝品质工厂怎么加入 编辑:程序博客网 时间:2024/06/05 15:20
1.APK在线升级
现在android开发,一般采用的是CS模式,那么apk的升级,自然而然需要有server端的支持。一般,我们将升级版本以及一个记录升级版本的配置文件(在本文中采用jsonarray格式)放在server端。当Client初始化时,如果检测到server端有更新的版本(读取server的配置文件),则将在server端的升级版本以Http的方式连接,将其下载下来,然后调用android的api进行替换升级。
2.Json文件
将json文件放到web服务器的Root目录下
[{"version":2.0,"description":"下载送大礼包","apkurl","http://192.168.1.127"}]
版本的比较,是根据update_version.json中的verCode以及apk文件中AndroidManifest.xml文件中的定义的版本号:
android:versionCode="1"android:versionName="1.0"
3.在主Activity文件中的onCreate()方法中调用checkUpdate();
方法,检查升级
/** * 检查是否有新版本,如果有就升级 */ private void checkUpdate() { new Thread(){ public void run() { //URL Message mes = Message.obtain(); long startTime = System.currentTimeMillis(); try { URL url = new URL(getString(R.string.serverUrl)); //联网 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(4000); int code = conn.getResponseCode(); if(code == 200) { //联网成功 InputStream is = conn.getInputStream(); //把流转成String类型 String result = StreamTools.readFromStream(is); Log.i(TAG, "联网成功了"+result); //JSON解析 JSONObject obj = new JSONObject(); version = (String) obj.get("version"); description = (String) obj.get("description"); apkurl = (String) obj.get("apkurl"); //校验是否有新版本 if(getVersionName().equals(version)) { //版本一致,没有新版本 mes.what = ENTER_HOME; }else { //有新版本,弹出一升级对话框 mes.what =SHOW_UPDATE_DIALOG; } } } catch (MalformedURLException e) { mes.what = URL_ERROR; e.printStackTrace(); }catch (IOException e) { // TODO: handle exception mes.what = NETWORK_ERROR; e.printStackTrace(); }catch (JSONException e) { // TODO: handle exception mes.what = JSON_ERROR; e.printStackTrace(); }finally { long endTime = System.currentTimeMillis(); long dTime = endTime - startTime; if(dTime < 2000) { try { Thread.sleep(2000 - dTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } handler.sendMessage(mes); } }; }.start(); }
private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SHOW_UPDATE_DIALOG://显示升级对话框 Log.i(TAG, "显示升级对话框"); showUpdateDialog(); break; case ENTER_HOME://进入主页面 enterHome(); break; case URL_ERROR://URL错误 enterHome(); Toast.makeText(getApplicationContext(), "URL错误", 0).show(); break; case NETWORK_ERROR://网络异常 enterHome(); Toast.makeText(getApplicationContext(), "网络异常", 0).show(); break; case JSON_ERROR://JSON解析出错 enterHome(); Toast.makeText(SplashActivity.this, "JSON解析出错", 0).show(); break; } } };
protected void showUpdateDialog() { AlertDialog.Builder builder = new Builder(this); builder.setTitle("提升升级");// builder.setCancelable(false);//点返回键没反应(强制升级) builder.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { //进入主页面 enterHome(); dialog.dismiss(); } }); builder.setMessage(description); builder.setPositiveButton("立刻升级", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //下载APK,并且替换安装 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //sdcard存在 //afnal FinalHttp finalHttp = new FinalHttp(); finalHttp.download(apkurl, Environment.getExternalStorageDirectory().getAbsolutePath()+"/mobilesafe2.0.apk", new AjaxCallBack<File>() { @Override public void onFailure(Throwable t, int errorNo, String strMsg) { t.printStackTrace(); Toast.makeText(getApplicationContext(), "下载失败了", 0).show(); super.onFailure(t, errorNo, strMsg); } @Override public void onLoading(long count, long current) { super.onLoading(count, current); //当前下载百分比 int progress = (int) (current * 100/count); tv_update_info.setText("下载进度:"+progress+"%"); } @Override public void onSuccess(File t) { super.onSuccess(t); installAPK(t); } /** * 安装APK * @param t */ private void installAPK(File t) { Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive"); startActivity(intent); } }); }else { Toast.makeText(getApplicationContext(), "没有sdcard,请安装上再试", 0).show(); return; } } }); builder.setNegativeButton("下次再说", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); enterHome();//进入主页面 } }); builder.show(); }
/** * @return * 得到应用程序的版本名称 */ private String getVersionName() { //用来管理手机的APK PackageManager manager = getPackageManager(); //得到APK的功能清单文件 try { PackageInfo info = manager.getPackageInfo(getPackageName(), 0); return info.versionName; } catch (Exception e) { e.printStackTrace(); return ""; } }
/** * 进入主页面 */ protected void enterHome() { Intent intent = new Intent(this,HomeActivity.class); startActivity(intent); //关闭当前页面 finish(); }
0 0
- 手机安全卫士学习之APK检查自动升级
- android APK检查自动升级的探讨
- 手机安全卫士学习之自定义组合控件
- 学习笔记之《Android项目实战——手机安全卫士》
- android apk 自动升级
- Android项目:手机安全卫士(2)—— 版本升级
- Android阶段学习笔记 8.1-8.6 之 手机安全卫士 Splash页面
- android apk自动升级实现
- 手机安全卫士------手机防盗页面之自定义对话框&MD5加密
- 手机安全卫士------手机防盗页面之发送短信&接收短信
- 腾讯QQ和360安全卫士之战升级
- 手机安全卫士学习第一课 闪屏页面Splash
- 基于 ionic 的 apk 自动升级
- 手机安全卫士项目
- 手机安全卫士01
- 手机安全卫士02
- 手机安全卫士03
- 手机安全卫士04
- Linux HA, MySQL cluster
- 日经社説 20150312 マイナンバー普及へ利用範囲の拡大を
- 使用JSONP解决跨域问题-代码示例
- commons-logging与log4j的区别与联系
- HDFS HA与QJM(Quorum Journal Manager)介绍及官网内容整理
- 手机安全卫士学习之APK检查自动升级
- Mac下android_sdk配置环境变量
- C++ 如何引用结构体数组作为函数形参
- 关于max-width:100% 不兼容的问题
- IOS学习 xcode设置项Architectures和Valid Architectures
- c++STL所有算法介绍
- STAF 删除文件操作
- PCA降维算法
- 字符串中 单词反转