一、 简介

现在的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. android 进度条ProgressBar样式设置
  2. 详解极光推送的 4 种消息形式—— Android(安卓)篇
  3. Android(安卓)NOtification 使用
  4. Android布局管理器详解
  5. Android——通知(Notification)
  6. android 浏览器 打开本地html文件的方法
  7. android progressBar 自定义 进度颜色
  8. Android与iOS在交互细节上的区别
  9. Android极光推送(Android(安卓)studio 3.0+)

随机推荐

  1. android app 静默安装
  2. iphone4抖动效果源码
  3. Android实现滑动加载数据的方法
  4. Android系统显示原理简介
  5. android带有占位符的国际化
  6. 10本最新的Android开发电子书免费下载
  7. Android(安卓)ndk r4 开发环境搭建
  8. GitHub上最火的Android开源项目 拿来就用
  9. Android水平进度条颜色和样式
  10. 为什么 Android 中 Toolbar.setTitle()