Android app自动更新逻辑与实现(真实项目的自动更新业务逻辑)

android app在用户安装到手机后版本需要升级,一般可以采取到应用商店或者官网下载最新版本,但这种方式会给用户带来多余的操作,同时不方便我们控制用户的版本。所以一般我们会在app内部集成自动更新功能

注:以下逻辑需要服务器支持(当然如果服务器不支持也就做不了自动更新)

一、检测新版本
更新升级第一步肯定是检测用户当前安装的app版本

下面是获取当前版本代码

    /**
     * 获取版本名称 * @param context 上下文 * @return 版本名称
     */
    public static String getVersionName(Context context) {
        //获取包管理器
        PackageManager pm = context.getPackageManager();
        //获取包信息
        try {
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
            //返回版本号
            return packageInfo.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取版本号 * @param context 上下文 * @return 版本号
     */
    public static String getVersionCode(Context context) {
        //获取包管理器
        PackageManager pm = context.getPackageManager();
        // 获取包信息
        try {
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
            //返回版本号
            return packageInfo.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }

获取到版本名称和版本号后(比对时根据需要比对一个即可),进行联网请求接口(这里需要服务器支持),将获取到的版本号发给后台服务器,服务器比对当前最新版本的版本号,如果是最新版返回数据告知app端不需要更新,如果不是返回最新版本相关信息,包括版本号、下载地址、此次更新内容、是否强制更新等等
二、检测到新版本后

又分为新版本强制更新、新版本用户选择更新。新版本强制更新时用户如果选择不更新则直接退出应用,如果选择更新后台直接下载新版本,同时当前app不再响应用户操作。新版本用户选择更新则比较简单,根据用户选择做出相应操作即可

三、下载

根据项目当前的联网框架,用服务器返回的URL下载相应apk文件即可,这里不同联网框架下载代码不同,大家可以自行搜索下自己用的联网框架怎么下载文件,这里不再举例

下载的同时最好弹出一个通知栏实时更新下载进度,给用户提示下面是创建通知

    private NotificationManager manager;
    private NotificationCompat.Builder builder;
    private Notification build;
     manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        builder = new NotificationCompat.Builder(context);
        builder.setProgress(100, 0, false);
        builder.setContentTitle("开始下载");
        builder.setSmallIcon(R.mipmap.app_ico);
        builder.setColor(context.getResources().getColor(R.color.title_blue));
        builder.setTicker("已开始下载");
        builder.setAutoCancel(true);
        build = builder.build();
        manager.notify(1, build);

在联网下载过程中进度回调将进度更新到通知栏(这里采用了handler更新进度),当进度达到100%时,说明apk文件下载完成,则点击通知栏时需要调用系统安装软件界面。具体代码如下:

 private Handler updateProgressHandle = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case DOWNLOADING:
//                    更新进度
                    if (progress != xprogress) {
                        builder.setContentTitle("已下载" + progress + "%");
                        builder.setProgress(100, progress, false);
                        builder.setAutoCancel(true);
                        build = builder.build();
                        manager.notify(1, build);
                    }
                    xprogress = progress;
                    break;

                case DOWNLOAD_FINISH:
//                    下载完成,点击可安装。
                    File apkFile = new File(savePath + versionName+".apk");
                    if (!apkFile.exists())
                        return;
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    Uri uri = Uri.parse("file://" + apkFile.toString());
                    intent.setDataAndType(uri, "application/vnd.android.package-archive");

                    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                    builder.setContentIntent(pendingIntent);
                    builder.setTicker("下载已完成");
                    builder.setContentTitle("下载已完成");
                    builder.setProgress(100, progress, false);
                    build = builder.build();
                    manager.notify(1, build);
                    break;
            }
        }
    };

以上业务逻辑是从之前项目中抽取出来的,当然软件版本升级还需要根据具体项目考虑一些别的需求,如在打开应用时自动检测更新和手动检测更新、用户选择更新时用户可以选择忽略此版本。(忽略此版本,可以在sp中或是其他地方存下当前忽略的最新版本的版本号,再向服务器获取当前最新版本版本号时,查找是否已经忽略,忽略则不做处理。注意:不能简单只存一个是否忽略的标记,我之前接收别的项目的时候就见过点击忽略此版本就只存了一个忽略标记,这样会使下次有别的版本更新,软件依然会认为用户已经忽略了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值