欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android应用强制更新APP的示例代码

程序员文章站 2023-12-17 20:08:22
android应用强制更新的用途十分广泛,特别上刚上线的应用肯定会存在或多或少的bug,特别是涉及移动支付这一块的内容,如果出错了会造成比较大的损失,所以强制更新显得尤为重...

android应用强制更新的用途十分广泛,特别上刚上线的应用肯定会存在或多或少的bug,特别是涉及移动支付这一块的内容,如果出错了会造成比较大的损失,所以强制更新显得尤为重要。

一般来说,强制更新的策略就是:

应用启动时请求后台,后台发送应用最新版本的信息(包括应用版本号、名称、更新内容说明、下载包的服务器地址、是否强制更新的标志位)等等。

下面我们就将根据以上思路来写实现代码。

1.androidmanifest配置版本信息

在androidmanifest.xml里定义了每个android apk的版本标识:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo"
android:versioncode="1"
android:versionname="1.0.0">
<application>
</application>
</manifest>

其中,package=”com.demo”是我们的包名;android:versioncode=”1”是版本代号,为整型数字;android:versionname=”1.0.0”是版本名称,为字符串,显示给用户看的。

当需要读取androidmanifest文件中版本号和版本名称的时候,用packagemanager就可以简单得到。代码如下所示:

public static int getvercode(context context) {
int vercode = -1;
try {
vercode = context.getpackagemanager().getpackageinfo(
"com.demo", 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.demo", 0).versionname;
} catch (namenotfoundexception e) {
log.e(tag, e.getmessage());
}
return vername;
}

2.进行版本检查

在服务端放置最新版本的apk文件,如:http://localhost/mydemo/demo.apk

同时,在服务端放置对应此apk的版本信息调用接口或者文件,如:http://localhost/mydemo/ver.json

ver.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();
}

更新下载:

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();
}

下载完成,通过handler通知主ui线程将下载对话框取消。

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);
}

如果你将apk应用发布到market上,那么,你会发现market内建了类似的模块,可以自动更新或者提醒你是否更新应用。那么,对于你自己的应用需要自动更新的话,自己内建一个是不是更加方便了呢?本文提到的代码大多是在updateactivity.java中实现,为了能够使更新过程更加友好,可以在最初launcher的activity中建立一个线程,用来检查服务端是否有更新。有更新的时候就启动updateactivity,这样的使用体验更加平滑。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: