You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android应用下载文件完成时弹出Toast通知

解决方案

实现原理

Android系统的DownloadManager会在下载任务完成时发送全局广播DownloadManager.ACTION_DOWNLOAD_COMPLETE,我们只需要注册对应的广播接收器监听该广播,判断下载任务状态成功后触发Toast即可。

具体实现步骤

  1. 修改原有下载代码,保存下载任务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();
    }
});
  1. 创建下载完成广播接收器
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();
            }
        }
    }
};
  1. 注册/注销广播接收器
    推荐在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:18:03