对于Android开发者而言,App应用内更新是不可避免的,强制更新和非强制更新也不相同。本文记录使用系统
自带的DownloadManager来实现App的普通更新和强制更新。DownloadManager已经帮我们处理好了网络和
通知栏的事情,我们只需要指定下载路径,指定通知栏样式和显示策略。
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(UPDATE_DOWN_URL));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalFilesDir(activity.get(), Environment.DIRECTORY_DOWNLOADS, UPDATE_SAVENAME);
request.allowScanningByMediaScanner();
// 设置一些基本显示信息
request.setTitle("正在下载");
request.setDescription("更新中...");
request.setMimeType("application/vnd.android.package-archive");
final long enqueueId = downloadManager.enqueue(request);
要点一:非强制更新,直接后台下载就好了,强制更新需要显示进度条,获取进度的方式有很多。1,是使用ContentResolver来获取下载的进度。2,可以使用定时器去轮训获取进度。获取进度如下:
private int[] getBytesAndStatus(long downloadId) {
int[] bytesAndStatus = new int[]{-1, -1, 0};
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = null;
try {
c = downloadManager.query(query);
if (c != null && c.moveToFirst()) {
bytesAndStatus[0] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
bytesAndStatus[1] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
bytesAndStatus[2] = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
}
} finally {
if (c != null) {
c.close();
}
}
return bytesAndStatus;
}
要点二:下载完成的通知,接收DownloadManager的完成广播。
DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())
要点三:系统版本不同,DownloadManager返回的downUri不同,需要要注意。分低于android6.0,android6.0,android7.0,android8.0这些版本。android7.0需要使用FileProvider
来获取下载的文件路径。android 8.0上需要注意 未知来源
,获取未知来源的权限:
@RequiresApi(api = Build.VERSION_CODES.O)
private void requestInstall() {
Uri packageURI = Uri.parse("package:" + this.getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, INSTALL_PACKAGES_REQUESTCODE);
}
记得在AndroidManifest文件添加权限
<!-- 8.0安装apk权限,需要允许安装未知应用 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
需要注意的差不多就是这些吧。强制更新下载的时候,如果有推送消息之类的,最好给关闭掉。避免用户通过推送进入App。
推荐一篇博客,写的很不错。Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)
一如既往,感谢前辈们!
努力前行!