android 判断app版本更新,android APP检测版本更新以及后台服务更新

本文介绍了Android应用程序如何检测版本更新,并在有新版本时通过后台服务进行更新。首先,通过获取本地和服务器的版本号进行比较,如果服务器版本号大于本地版本号,显示更新提示对话框。用户选择更新后,启动后台服务下载新APK并安装。服务的实现包括下载进度通知和下载完成后自动启动安装流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android APP检测版本更新以及后台服务更新

版本更新是获取本地版本号跟服务器版本号进行对比,当有更新的时候服务器会上传新的APK文件,

并且版本号是比没更新的版本号要大的,因此就是版本号的比较来确定是否需要更新。当需要更新

的时候就通过启动后台服务来更新。介绍一下各个知识点:

1、获取本地版本号

//获取本地的版本号

private int getVersionCode(){

PackageManager packageManager=getPackageManager();

try {

PackageInfo packageInfo=packageManager.getPackageInfo(getPackageName(), 0);

int versionCode=packageInfo.versionCode;

return versionCode;

} catch (NameNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return -1;

}

调用上面方法返回的就是本地版本号。

2、获取服务器版本号

private void checkVersion() {

final long startTime=System.currentTimeMillis();

new Thread(){

public void run(){

HttpURLConnection conn=null;

Message msg=Message.obtain();

try {

URL url=new URL(GlobalUrl.VERSION_URL);

conn=(HttpURLConnection) url.openConnection();

conn.setRequestMethod("POST");

conn.setConnectTimeout(5000);

conn.setReadTimeout(5000);

conn.connect();

int responseCode=conn.getResponseCode();

if(responseCode==200){

InputStream inputStream=conn.getInputStream();

ByteArrayOutputStream out=new ByteArrayOutputStream();

int len=0;

byte []buffer=new byte[1024];

while((len=inputStream.read(buffer))!=-1){

out.write(buffer, 0, len);

}

inputStream.close();

out.close();

String result=out.toString();

System.out.println("VersionResult:"+result);

String success = null;

try {

JSONObject jo=new JSONObject(result);

success=jo.getString("success");

System.out.println(success);

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Gson gson=new Gson();

if(success.equals("true")){

versionData=gson.fromJson(result,VersionData.class);

version=versionData.version;

mVersionName=version.releaseCode; //版本描述

mVersionCode=version.releaseNumber; //服务器版本号

mDesc=version.releaseNotes; //更新内容

mDownloadUrl=version.app; //下载新的APP的地址

//这里服务器返回的是String类型的版本号,其实版本号应该是int类型的

//然后判断版本号是否一致

if(!mVersionCode.equals(getVersionCode()+"")){

msg.what=CODE_UPDATE_DIALOG;

}else{

msg.what=CODE_ENTER_HOME;

}

}

}

}catch (MalformedURLException e) {

//url错误

msg.what=CODE_URL_ERROR;

e.printStackTrace();

}catch (IOException e) {

//网络错误

msg.what=CODE_NET_ERROR;

e.printStackTrace();

}finally{

long endTime=System.currentTimeMillis();

long timeUsed=endTime-startTime;

if(timeUsed<2000){

try {

Thread.sleep(2000-timeUsed);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

handler.sendMessage(msg);

if(conn!=null){

//关闭网络连接

conn.disconnect();

}

}

}

}.start();

}

//handler处理对应的消息

private Handler handler=new Handler(){

public void handleMessage(Message msg) {

switch (msg.what) {

case CODE_UPDATE_DIALOG:

//弹窗是否需要更新

showUpDataDialog();

break;

case CODE_ENTER_HOME:

//进入下个页面。即使忽略更新

jumpNextPage();

break;

case CODE_URL_ERROR:

jumpNextPage();

break;

case CODE_NET_ERROR:

jumpNextPage();

break;

case CODE_JSON_ERROR:

jumpNextPage();

break;

default:

break;

}

};

};

获取服务器版本号就是网络请求服务器的数据,得到版本号以及版本描述和新版本的下载地址,将服务器的

版本号跟本地版本号进行对比。大于本地版本号或者跟本地版本号不一致则弹窗提示是否需要更新。

弹窗代码如下:

protected void showUpDataDialog() {

AlertDialog.Builder builder=new AlertDialog.Builder(this);

builder.setTitle("最新版本:"+mVersionName);

builder.setMessage(mDesc);

builder.setPositiveButton("稍后再说", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

jumpNextPage();

}

});

builder.setNegativeButton("立即更新", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

//启动服务

Intent intent=new Intent(SplashActivity.this,UpdateService.class);

intent.putExtra("appName", "CraveHome");

intent.putExtra("url",mDownloadUrl );

startService(intent);

jumpNextPage();

}

});

可以看到取消就直接进入主页面,即使忽略更新。确定就是启动我们的服务来下载最新的APP进行安装。

启动服务需要先新建一个服务。如下:

public class UpdateService extends Service{

private String appName;

private String url;

String target;

//通知栏

private Notification notification=null;

private NotificationManager notificationManager = null;

// 通知栏跳转Intent

private Intent updateIntent = null;

private PendingIntent pendingIntent = null;

Notification.Builder builder1;

@Override

public IBinder onBind(Intent intent) {

return null;

}

@SuppressLint("NewApi") @Override

public int onStartCommand(Intent intent, int flags, int startId) {

appName=intent.getStringExtra("appName");

url=intent.getStringExtra("url");

//创建下载APK的路径

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

target=Environment.getExternalStorageDirectory().getAbsolutePath()+"/crave.apk";

}

notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

builder1 = new Notification.Builder(this);

builder1.setSmallIcon(R.drawable.ic_launch); //设置图标

builder1.setTicker("CraveHome开始下载");

builder1.setContentTitle(appName); //设置标题

builder1.setContentText("正在下载:"); //消息内容

builder1.setWhen(System.currentTimeMillis()); //发送时间

// builder1.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音,振动方式,灯光

builder1.setAutoCancel(true);//打开程序后图标消失

// // 设置下载过程中,点击通知栏,回到主界面

// updateIntent = new Intent(this, MainActivity.class);

// pendingIntent =PendingIntent.getActivity(this, 0, updateIntent, 0);

// builder1.setContentIntent(pendingIntent);

notification = builder1.build();

// 通过通知管理器发送通知֪

notificationManager.notify(124, notification);

if(url!=null){

downLoad(url);

}

return super.onStartCommand(intent, flags, startId);

}

private void downLoad(String url) {

HttpUtils utils=new HttpUtils();

utils.download(url, target, new RequestCallBack() {

@Override

public void onStart() {

System.out.println("CraveHome开始下载");

super.onStart();

}

@SuppressLint("NewApi") @Override

public void onLoading(long total, long current, boolean isUploading) {

System.out.println("正在下载:"+current * 100 / total);

builder1.setContentText("正在下载:"+current * 100 / total+"/100"); //消息内容

if(current==total){

builder1.setContentText("下载完成");

builder1.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音,振动方式,灯光

}

notification = builder1.build();

notificationManager.notify(124, notification); //通过通知管理器发送通知

super.onLoading(total, current, isUploading);

}

@Override

public void onSuccess(ResponseInfo arg0) {

System.out.println("arg0:"+arg0.result);

Intent intent=new Intent(Intent.ACTION_VIEW);

intent.addCategory(Intent.CATEGORY_DEFAULT);

intent.setDataAndType(Uri.fromFile(arg0.result), "application/vnd.android.package-archive");

//在BroadcastReceiver和Service中startActivity要加上此设置

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

// 结束service

stopSelf();

}

@Override

public void onFailure(HttpException arg0, String arg1) {

System.out.println(arg1);

// 结束service

stopSelf();

}

});

}

@Override

public void onDestroy() {

System.out.println("serviceDestroy");

super.onDestroy();

}

}

然后不要忘记了要在manifest里面进行注册:

当然还需要网络访问权限以及文件操作权限:

以上就是此文内容!

附上Demo下载链接:http://download..net/detail/qq_30219217/9639022

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值