0

這裏後如何停止正在運行的下載情況:系統重啓

  1. 我開始下載
  2. 我重啓設備(測試應用程序的健壯性)
  3. 我使用啓動接收通知重啓
  4. 中的onReceive方法我稱之爲clearDownloadsAfterReboot()方法:

    @Override 
        public void onReceive(final Context context, Intent intent) { 
        clearDownloadsAfterReboot(context); 
        } 
    
  5. 的clearDownloadsAfterReboot()方法被調用,並嘗試刪除下載像這樣:

    private void clearDownloadsAfterReboot(final Context context){ 
        //Added delay to make sure download has started 
        new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
    
         DownloadManager manager = (DownloadManager) context.getSystemService(context.DOWNLOAD_SERVICE); 
         DownloadManager.Query query = new DownloadManager.Query(); 
         query.setFilterById (DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PENDING|DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PAUSED); 
         Cursor c = manager.query(query); 
         // -------> c.getCount() returns 0 despite the download being visible 
         while(c.moveToNext()) { 
          //This never executes because c has a count of 0 
          int removedInt = manager.remove(c.getLong(c.getColumnIndex(DownloadManager.COLUMN_ID))); 
         } 
        } 
        }, 45000); 
    } 
    
  6. 光標返回0,所以remove()方法永遠不會被調用,但是,我可以看到下載的運行狀態欄,因此至少有1個下載正在運行。

我一言以蔽之問題:如何停止在重啓後運行下載?而且,爲什麼當下載正在運行時,manager.query()方法返回的結果爲0的遊標?

我知道還有其他關於停止下載的問題,但是這些都無法解決我的問題。

在此先感謝。

+2

您正在使用setFilterById()方法傳遞來自DownloadManager的狀態組合,當該方法實際上期望枚舉下載ID時。因此,請傳遞下載ID或使用setFilterByStatus()方法與當前使用的標誌組合。 – Luksprog

+0

感謝您的回覆。我認爲你是對的。現在我已經將方法更改爲setFilterByStatus(),光標將返回正確的下載量。而且,它確實顯示下載已停止(它保持在0%),但是,「正在進行下載」的通知在通知托盤停止後不會從通知托盤中清除。你知道爲什麼會發生嗎?再次感謝 –

回答

1

信貸對這個答案的第一部分進入@Lukesprog

我需要使用setFilterByStatus()而不是setFilterById()。在交換這兩種方法後,我能夠成功地停止下載,並且manager.query()方法返回了包含正確下載量的遊標。

但是,由於某種原因,顯示下載進度的通知在下載停止後並未清除。爲了清除通知,您需要撥打manager.remove(c.getLong(c.getColumnIndex(DownloadManager.COLUMN_ID)));兩次