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

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<File>() {
        @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<File> 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里面进行注册:

 <!-- 注册更新服务 -->
    <service android:name="com.demo.UpdateService" />

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

 <!-- 允许应用程序写入sd卡 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET" />

以上就是此文内容!
附上Demo下载链接:http://download.csdn.net/detail/qq_30219217/9639022

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值