如何在Android应用下载文件完成时弹出Toast通知
解决方案
实现原理
Android系统的DownloadManager会在下载任务完成时发送全局广播DownloadManager.ACTION_DOWNLOAD_COMPLETE,我们只需要注册对应的广播接收器监听该广播,判断下载任务状态成功后触发Toast即可。
具体实现步骤
- 修改原有下载代码,保存下载任务ID
downloadManager.enqueue(request)方法会返回一个long类型的唯一任务ID,我们需要把它存下来,用来后续匹配对应的下载任务:
// 声明全局变量保存下载ID private long downloadId; // 原有下载逻辑修改如下 webView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setMimeType(mimeType); String cookies = CookieManager.getInstance().getCookie(url); request.addRequestHeader("cookie",cookies); request.addRequestHeader("User-Agent",userAgent); request.setDescription("Downloading File"); request.setTitle(URLUtil.guessFileName(url,contentDisposition,mimeType)); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url, contentDisposition, mimeType)); DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); // 保存返回的下载ID downloadId = downloadManager.enqueue(request); Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_SHORT).show(); } });
- 创建下载完成广播接收器
private BroadcastReceiver downloadCompleteReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 校验广播动作和对应的下载ID if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())) { long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); if (completeDownloadId == downloadId) { // 查询下载状态 DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(downloadId); DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); Cursor cursor = downloadManager.query(query); if (cursor.moveToFirst()) { int status = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS)); if (status == DownloadManager.STATUS_SUCCESSFUL) { // 下载成功弹Toast Toast.makeText(getApplicationContext(), "文件下载完成", Toast.LENGTH_SHORT).show(); } else if (status == DownloadManager.STATUS_FAILED) { // 可选:下载失败提示 Toast.makeText(getApplicationContext(), "文件下载失败", Toast.LENGTH_SHORT).show(); } } cursor.close(); } } } };
- 注册/注销广播接收器
推荐在Activity的生命周期方法中动态注册和注销,避免内存泄漏:
@Override protected void onResume() { super.onResume(); // 注册下载完成广播接收器 IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); registerReceiver(downloadCompleteReceiver, filter); } @Override protected void onPause() { super.onPause(); // 注销广播接收器 unregisterReceiver(downloadCompleteReceiver); }
注意事项
- 如果需要同时支持多个下载任务,可以用
List<Long>存储所有下载ID,匹配时遍历判断即可 - Android 12及以上系统动态注册广播不需要额外声明权限,直接使用即可
内容的提问来源于stack exchange,提问作者Gedanggoreng
相关产品推荐
相关产品推荐

