web-dev-qa-db-ja.com

DownloadManagerを使用して開始したダウンロードをキャンセル/停止することはできますか?

DownloadManagerを使用して、アプリケーション内の多数のファイルをダウンロードしています。 downloadManagerによってキューに入れられたダウンロードをキャンセルする方法を理解できません。

2つの可能性があります。ユーザーは、通知バーでクリックすることにより、手動でキャンセルすることができます。 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);

}

洞察はありますか?

21
PravinCG

remove(long...)メソッドを呼び出すことにより、DownloadManager経由でダウンロードをキャンセルできます。このためには、ダウンロードのIDが必要です。私の経験から、基本的には2つの信頼できる方法で取得できます。

  1. enqueue(DownloadManager.Request)メソッドの戻り値を思い出してください。
  2. query(DownloadManager.Query)メソッドを介してDownloadManagerのダウンロードをクエリします。次に、返されたCursorからIDを取得します。IDは_DownloadManager.COLUMN_ID_という名前の列に格納されます。

放送受信機

私の経験から、_BroadcastReceiverアクション_Android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED_を介してダウンロードIDを取得することは信頼できません(ただし、ブロードキャストは常に送信されます)。

  1. 余分な_DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS_からダウンロードIDを取得すると、正しく機能しません。一部のデバイスでは、常にnullを返します。一部のデバイスで何かが返された場合は、最初に開始されたダウンロードのIDです。また、最初のダウンロードが完了/キャンセルされた場合は、残りのダウンロードの通知に対してnullを返します。
  2. 余分な_DownloadManager.EXTRA_DOWNLOAD_ID_から値を取得することは、このアクションでは機能しません。

アクション_Android.intent.action.DOWNLOAD_COMPLETE_のブロードキャストでIDを取得することは信頼できるようです。追加の_DownloadManager.EXTRA_DOWNLOAD_ID_から取得する必要があります。ブロードキャストは、ダウンロードが完了した場合だけでなく、ダウンロードをキャンセルしてremove()を呼び出したときにも送信されることに注意してください。

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

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

54
Tomik