Android(安卓)实现本地更新并在更新完成后打开
16lz
2021-01-25
一、 简介
现在的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));
记得解除这个广播。
三、注意事项
在一些厂商的手机上例如小米,华为等,需要打开对第三方来源应用的信任,不然会在启动安装的时候安装失败。
更多相关文章
- android 进度条ProgressBar样式设置
- 详解极光推送的 4 种消息形式—— Android(安卓)篇
- Android(安卓)NOtification 使用
- Android布局管理器详解
- Android——通知(Notification)
- android 浏览器 打开本地html文件的方法
- android progressBar 自定义 进度颜色
- Android与iOS在交互细节上的区别
- Android极光推送(Android(安卓)studio 3.0+)