实用网络站
白蓝主题五 · 清爽阅读
首页  > 压缩备份

Android App里加个下载功能,真没那么难

做安卓开发时,经常遇到这种需求:用户点一下按钮,就把一个PDF、压缩包或者更新包从服务器拉下来,存到手机里,方便离线查看或后续解压使用。尤其在‘压缩备份’这类工具类App里,ref="/tag/91/" style="color:#B2A89E;font-weight:bold;">下载几乎是标配——比如备份完微信聊天记录生成zip,就得让用户一键下载到本地。

不用轮子?先试试系统原生DownloadManager

很多开发者一上来就想集成OkHttp+FileOutputStream手动写,其实大可不必。Android自带的DownloadManager轻量、稳定、省电,还自动处理断点续传和通知栏展示,特别适合下载中大型文件(比如10MB以上的zip备份包)。

几行代码就能跑起来:

DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse("https://yoursite.com/backup_20240512.zip");
DownloadManager.Request request = new DownloadManager.Request(uri)
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "backup_20240512.zip")
.setTitle("我的备份文件")
.setDescription("正在下载压缩备份包...");
dm.enqueue(request);

注意两点:目标目录用Environment.DIRECTORY_DOWNLOADS,这样文件会进系统‘下载’文件夹,用户用文件管理器一眼就能找到;别忘了在AndroidManifest.xml里加权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />(Android 10+建议改用分区存储适配,但基础下载场景仍可用)。

想更灵活?用OkHttp配合File写入

如果要显示实时进度条、支持暂停恢复、或把文件直接存进App私有目录(比如getFilesDir()),那就得自己管IO。OkHttp + FileOutputStream组合够用又清晰:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://yoursite.com/backup.zip")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
File file = new File(getFilesDir(), "backup.zip");
try (InputStream is = response.body().byteStream();
FileOutputStream os = new FileOutputStream(file)) {
byte[] buffer = new byte[4096];
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
// 更新UI进度:publishProgress(len)
}
}
}
}

这段代码跑在后台线程里,下载完的zip就安静躺在App自己的目录下,不怕被用户误删,也方便后续直接调用ZipInputStream解压读取。

别忘了压缩包下载后的那一步

下载只是前半场。用户点了‘下载备份包’,你得让人知道它在哪、能不能打开。建议下载完成后自动弹个Toast:“已保存至下载目录”,再加个按钮跳转到文件管理器定位该zip——用Intent.ACTION_VIEW搭配FileProvider,比让用户自己翻文件夹友好得多。