2012-12-28 3 views
16

私はDownloadManagerを使用してアプリケーション内に多数のファイルをダウンロードしています。私はdownloadManagerによってエンキューされたダウンロードを取り消す方法を理解することができません。DownloadManagerを使用してダウンロードをキャンセル/停止することはできますか?

2つの可能性があります。 a。ユーザーは、通知バーでクリックして手動でキャンセルすることができます。 b。ダウンロードしたコードをキャンセルして削除します。

以下の受信機が定義されています。

<receiver 
     android:name=".DownloadStatusReceiver" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
      <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" /> 
    </intent-filter> 
</receiver> 

と受信機

if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) { 

    Constants.showLog(TAG, "Notification clicked"); 
    long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
    DownloadManager dm =(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);    
    dm.remove(downloadId); 

} 

任意の洞察力で?

+0

'remove()'はドキュメントに従って動作するはずです。もちろん、あなたはダウンロードが完了するまで 'remove()'を呼んでいるようではありません。それは、馬がボルト止めされた後に納屋をロックするようなものです。 :-) – CommonsWare

+0

組み込みのダウンロードマネージャはバグがあり、古いデバイスでは動作しないため、私自身のダウンロードワークフローを実装します。 – vorrtex

+0

@ CommonSWare:通知バーがクリックされたときに削除を呼び出しています。通知のクリックイベントは、ダウンロードが完了したかどうかによって異なります。 – PravinCG

答えて

48

DownloadManagerでダウンロードをキャンセルするには、remove(long...)メソッドを呼び出します。このためには、ダウンロードのIDが必要です。

  1. enqueue(DownloadManager.Request)メソッドの戻り値を覚えている:私の経験から、基本的にそれを得るためにどのように信頼性の高い2通りの方法があります。
  2. query(DownloadManager.Query)メソッドを使用してDownloadManagerをダウンロードしてください。その後、返されたCursorからIDを取得すると、それらはDownloadManager.COLUMN_IDという名前の列に格納されます。

ブロードキャストレシーバー

私の経験から(放送は常に送信されますが)、アクションandroid.intent.action.DOWNLOAD_NOTIFICATION_CLICKEDためBroadcastReceiverを経由して、ダウンロードIDを取得するために信頼性がありません。

  1. DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDSからダウンロードIDを取得することが正しく機能しません。一部のデバイスでは、常にnullが返されます。一部のデバイスで何かが返された場合は、最初に開始されたダウンロードのIDです。最初のダウンロードが終了/キャンセルされた場合、残りのダウンロードの通知にnullが返されます。
  2. DownloadManager.EXTRA_DOWNLOAD_IDから値を取得することはできません。

IDを取得してアクションのためにブロードキャストするandroid.intent.action.DOWNLOAD_COMPLETEは信頼できるようです。あなたは余分なDownloadManager.EXTRA_DOWNLOAD_IDからそれを得なければなりません。ブロードキャストは完了したダウンロードだけでなく、remove()のダウンロードをキャンセルしたときにも送信されます。

注: ダウンロードは1つの通知でグループ化されることがあります。複数の通知が作成されることもあります。私は、通知が行われ、グループ化されないときの条件を把握することができませんでした。それは、OSのバージョン、デバイス、ダウンロードタイトルなどの多くの要因に依存するようです...そして、一般的には予測できないようです。

注: 他のアプリのダウンロードをキャンセルできるかどうかはテストしましたが、そうではありません。 IDはすべてのアプリで一意のデータベースIDですがremove()を呼び出しても、別のアプリのダウンロードはキャンセルされません。

+1

トミクさん、ありがとうございました。あなたはそれをうまく要約しました。私は同じことを観察したことに同意します。私はこの回答を受け入れているので、将来他の人に役立つでしょう。 – PravinCG

+0

非常に便利です。個人的な経験を与えることは常に最も価値のあるものです。多くの時間を節約します。 – mmlooloo

+2

@Tomik、実際にDOWNLOAD_NOTIFICATION_CLICKEDでIDを取得するにはどうすればよいですか?私は同時にいくつかのファイルをダウンロードしていますが、すべてのIDを保持することはできません。 – MadDeveloper

関連する問題