一、 简介
现在的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));
记得解除这个广播。
三、注意事项
在一些厂商的手机上例如小米,华为等,需要打开对第三方来源应用的信任,不然会在启动安装的时候安装失败。