Android 实现本地更新并在更新完成后打开

一、 简介

现在的android应用app会隔一段时间发布一个新的版本,当你打开某个app,如果有最新的版本,会提醒你是否下载更新。本文利用android自带的下载管理器DownloadManager进行下载最新版本的apk,下载完成后自动跳转安装。

二、实现

1 Code比较

首先你需要去向服务器获取当前最新的版本的VersionCode,与本地的Code比较。通
本地的获取方法如下:

PackageManager packageManager = this.getPackageManager();
        PackageInfo packageInfo;
        int versionCode = 0;
        try {
            packageInfo = packageManager.getPackageInfo(this.getPackageName(), 0);
            versionCode = packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
2 调用DownloadManager
 public static long download(String url) {
        // 创建下载请求
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        /*
         * 设置在通知栏是否显示下载通知(下载进度), 有 3 个值可选:
         *    VISIBILITY_VISIBLE:                   下载过程中可见, 下载完后自动消失 (默认)
         *    VISIBILITY_VISIBLE_NOTIFY_COMPLETED:  下载过程中和下载完成后均可见
         *    VISIBILITY_HIDDEN:                    始终不显示通知
         */
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        // 设置通知的标题和描述
        request.setTitle("标题");
        request.setDescription("下载中。。。");
        // 设置下载文件的保存位置(这里直接放在了根目录下,有需要的话自行修改)
        File saveFile = new File(Environment.getExternalStorageDirectory(), "XXXX.apk");
        request.setDestinationUri(Uri.fromFile(saveFile));
        // 获取下载管理器服务的实例, 添加下载任务
        DownloadManager manager = (DownloadManager) AppContext.getInstance().getSystemService(Context.DOWNLOAD_SERVICE);
        // 将下载请求加入下载队列, 返回一个下载ID
        return manager.enqueue(request);
    }
3 查询进度

到这里已经完成大部分了,然后就是等待下载的完成。一般会需要查询一下进度来显示一个进度条。
查询方法如下:

 public static float query(long id) {
        // 获取下载管理器服务的实例
        DownloadManager manager = (DownloadManager) AppContext.getInstance().getSystemService(Context.DOWNLOAD_SERVICE);
        // 创建一个查询对象
        DownloadManager.Query query = new DownloadManager.Query();
        // 根据 下载ID 过滤结果c
        query.setFilterById(id);
        // 执行查询, 返回一个 Cursor
        Cursor cursor = manager.query(query);
        if (!cursor.moveToFirst()) {
            cursor.close();
            return 0.0f;
        }
        // 已下载的字节大小
        long downloadedSoFar = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
        // 下载文件的总字节大小
        long totalSize = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
        cursor.close();

        return ((float) (downloadedSoFar) / (float) (totalSize));
    }
4 启动安装

需要注册一个监听下载完成的广播接收者,在其中直接实现运行方法。

class DownLoadCompleteReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            long myDownLoadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);  //拿到下载的Id
            if (downloadId == myDownLoadId) {
                DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                Intent updateApk = new Intent(Intent.ACTION_VIEW);
                // 获取下载的文件路径
                Uri downloadFileUri = downloadManager.getUriForDownloadedFile(myDownLoadId);
                updateApk.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
                updateApk.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                // 运行
                context.startActivity(updateApk);
            }
        }
    }

最好动态注册,在确认更新后在去注册。

registerReceiver(downLoadCompleteReceiver,
                            new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

记得解除这个广播。

三、注意事项

在一些厂商的手机上例如小米,华为等,需要打开对第三方来源应用的信任,不然会在启动安装的时候安装失败。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值