Ответ 1
Вы можете отменить скачивание через DownloadManager
, вызвав его метод remove(long...)
. Для этого вам нужен идентификатор загрузки. По моему опыту в основном есть два надежных способа, как их получить:
- Помните возвращаемое значение метода
enqueue(DownloadManager.Request)
. - Запросить
DownloadManager
для загрузки через методquery(DownloadManager.Query)
. Затем извлеките идентификаторы из возвращаемогоCursor
, они хранятся в столбце с именемDownloadManager.COLUMN_ID
.
широковещательный приемник
Из моего опыта, нет надежного получения идентификатора загрузки через BroadcastReceiver
для действия android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED
(хотя широковещательная передача всегда отправляется).
- Получение идентификаторов загрузки из дополнительных
DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS
не работает должным образом. На некоторых устройствах он всегда возвращает null. Если он возвращает что-то на некоторых устройствах, сначала начинается идентификатор загрузки. И если первая загрузка завершена/отменена, она возвращает null для уведомления о оставшихся загрузках. - Получение значения из дополнительного
DownloadManager.EXTRA_DOWNLOAD_ID
не работает для этого действия.
Получение идентификатора в трансляции для действия android.intent.action.DOWNLOAD_COMPLETE
кажется надежным. Вы должны получить его из дополнительного DownloadManager.EXTRA_DOWNLOAD_ID
. Обратите внимание, что широковещательная передача отправляется не только для завершенной загрузки, но также отправляется при отмене вызова загрузки remove()
.
Примечание: Загрузки иногда группируются в одном уведомлении, иногда создают несколько уведомлений. Я не смог определить условия, когда уведомления делают и не группируются. Похоже, что это зависит от многих факторов, таких как версия ОС, устройство, название загрузки,... и вообще кажется довольно непредсказуемым.
Примечание:
Я тестировал, можно ли отменить загрузку другого приложения, и это не так. Несмотря на то, что идентификаторы являются идентификаторами базы данных, которые уникальны во всех приложениях. Вызов remove()
не отменяет загрузку другого приложения.