【问题标题】:How to notify after all download completed from Android download manager从 Android 下载管理器完成所有下载后如何通知
【发布时间】:2017-04-20 08:47:44
【问题描述】:

我正在使用 Android 下载管理器类。所有下载完成后,我需要写“下载完成”。我已经尝试了一些东西并且它正在工作。但是在这里,它是在逐个文件完成后写入的。我只需要写一次(全部完成后)。我也试过没有光标。但我未能实现。

public class DownloadReceiver extends BroadcastReceiver {


Context context;
@Override
public void onReceive(Context context, Intent intent) {
    long receivedID = intent.getLongExtra(
             DownloadManager.EXTRA_DOWNLOAD_ID, -1L);
             DownloadManager mgr = (DownloadManager)
            context.getSystemService(Context.DOWNLOAD_SERVICE);

    DownloadManager.Query query = new DownloadManager.Query();
    query.setFilterById(receivedID);
    Cursor cur = mgr.query(query);
    int index = cur.getColumnIndex(DownloadManager.COLUMN_STATUS);
    if(cur.) {
        String  filePath = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_TITLE));
        if(cur.getInt(index) == DownloadManager.STATUS_SUCCESSFUL){
            DatabaseHandler dh = new DatabaseHandler(context);
            dh.addDownloadComplete(new DownloadComplete("Download Complete"));
        }
    }
    cur.close();
}}

【问题讨论】:

  • 全部下载完成后是什么意思?您是否有一组下载 ID 要检查它们是否完整,或者您只想检查 DownloadManager 中的每个下载(无论是否来自您的应用程序)是否已完成?
  • 我正在从列表中下载文件。在上面的示例中,它一一检查并一一写入下载完成。但我需要的是,下载完所有文件后,我需要写一次下载完成。

标签: android android-download-manager


【解决方案1】:

在通知所有下载完成之前添加检查。喜欢

query.setFilterByStatus(DownloadManager.STATUS_PAUSED |
      DownloadManager.STATUS_PENDING |
      DownloadManager.STATUS_RUNNING);
    Cursor cursor = downloadManager.query(query);
    if (cursor != null && cursor.getCount() > 0) {
      return;
    }else {
      query.setFilterById(receivedID);
      //proceed your...
    }

【讨论】:

  • 此解决方案的问题是可能存在由其他应用程序启动的下载(暂停、挂起或运行)。此外,它不检查下载是否失败。
  • 注册接收者 这工作正常。供您确认下载其他应用程序的任何文件。
【解决方案2】:

这是我认为可行的方法。定义一个函数如下:

public boolean areAllDownloadsComplete(int[] downloadIds) {

    DownloadManager mgr = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

    DownloadManager.Query query = new DownloadManager.Query();

    for(int i = 0; i < downloadIds.length; i++) {

        query.setFilterById(downloadIds[i]);

        Cursor cur = mgr.query(query);

        if(cur.moveToNext()) {

            if(cur.getInt(cur.getColumnIndex(DownloadManager.COLUMN_STATUS)) != DownloadManager.STATUS_SUCCESSFUL) {

                return false;
            }
        }
    }

    return true;
}

在广播中调用此函数(在每次下载完成通知时),如下所示:

if(areAllDownloadsComplete(THE_DOWNLOAD_IDS)) {
    DatabaseHandler dh = new DatabaseHandler(context);
    dh.addDownloadComplete(new DownloadComplete("Download Complete"));
}

您可以将下载 ID 传递给您的广播接收器意图

Bundle bundle = new Bundle();
bundle.putIntArray("download_ids", THE_DOWNLOAD_IDS);
intent.putExtra(bundle);

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2014-02-23
    相关资源
    最近更新 更多