博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【android】apk在线升级
阅读量:6228 次
发布时间:2019-06-21

本文共 4504 字,大约阅读时间需要 15 分钟。

    现在android开发,一般采用的是CS模式,那么apk的升级,自然而然需要有server端的支持。一般,我们将升级版本以及一个记录升级版本的配置文件(在本文中采用jsonarray格式)放在server端。当Client初始化时,如果检测到server端有更新的版本(读取server的配置文件),则将在server端的升级版本以Http的方式连接,将其下载下来,然后调用android的api进行替换升级。

一、配置文件:

update_version.json

[{"appname":"myapp","apkname":"myapp.apk","verName":1.0,"verCode":1}]

    版本的比较,是根据update_version.json中的verCode 以及apk文件中AndroidManifest.xml文件中的定义的版本号:

android:versionCode="1"android:versionName="1.0"

二、初始化时比较版本

//比较服务器版本//在 onCreate函数中调用if (getServerVerCode()) {	int vercode = Config.getVerCode(this);	if (newVerCode > vercode) {		doNewVersionUpdate();//发现新版本更新	} else {		Toast.makeText(getApplicationContext(),"目前是最新版本,感谢您的支持",Toast.LENGTH_LONG).show();//没有新版本	}}//子函数,获取版本号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;}//子函数,若是有新版本,则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(UpdateActivity.this)            .setTitle("软件更新")            .setMessage(sb.toString())            // 设置内容            .setPositiveButton("更新",// 设置确定按钮                    new DialogInterface.OnClickListener() {                         @Override                        public void onClick(DialogInterface dialog,                                int which) {                            pBar = new ProgressDialog(UpdateActivity.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();}

三、下载并升级

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 byte[1024];						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();	}	void down() {		handler.post(new Runnable() {			public void run() {				pBar.cancel();				update();			}		});	}	void update() {		Intent intent = new Intent(Intent.ACTION_VIEW);		intent.setDataAndType(Uri.fromFile(new File(Environment				.getExternalStorageDirectory(), Config.UPDATE_SAVENAME)),				"application/vnd.android.package-archive");		startActivity(intent);	}

还有一些细节,没有说出来~

相关文献参考:

 

 

转载地址:http://dznna.baihongyu.com/

你可能感兴趣的文章
Socket拆包和解包
查看>>
工作之忠、智、勇
查看>>
电子书下载:Beginning Nokia Apps Development: Using MeeGo, Mobile QT and OpenSymbian
查看>>
mysql 5.0存储过程学习总结
查看>>
matlab练习程序(Ritter‘s最小包围圆)
查看>>
SQL存储过程教程
查看>>
最详细的临时表,表变量的对比
查看>>
C#中直接打印Report文件(rdlc)
查看>>
C 温故知新 之 指针:基本概念&变量的指针和指向变量的指针
查看>>
引用计数
查看>>
C#:XML操作类 (转)
查看>>
struts2 API chm帮助文档生成介绍说明(转)
查看>>
ORACLE数据缓冲区DB cache
查看>>
数据字典统一管理,动态下拉框
查看>>
不让自己的应用程序在桌面的图标列表里启动显示的方法
查看>>
矩阵的坐标变换(转)
查看>>
汽车常识全面介绍 - 引擎详论
查看>>
枚举类型、结构体和类的区别
查看>>
AngularJS使用ngMessages进行表单验证
查看>>
【Spark 深入学习 01】 Spark是什么鬼?
查看>>