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);
}
洞察はありますか?
remove(long...)
メソッドを呼び出すことにより、DownloadManager
経由でダウンロードをキャンセルできます。このためには、ダウンロードのIDが必要です。私の経験から、基本的には2つの信頼できる方法で取得できます。
enqueue(DownloadManager.Request)
メソッドの戻り値を思い出してください。query(DownloadManager.Query)
メソッドを介してDownloadManager
のダウンロードをクエリします。次に、返されたCursor
からIDを取得します。IDは_DownloadManager.COLUMN_ID
_という名前の列に格納されます。放送受信機
私の経験から、_BroadcastReceiver
アクション_Android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED
_を介してダウンロードIDを取得することは信頼できません(ただし、ブロードキャストは常に送信されます)。
DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS
_からダウンロードIDを取得すると、正しく機能しません。一部のデバイスでは、常にnullを返します。一部のデバイスで何かが返された場合は、最初に開始されたダウンロードのIDです。また、最初のダウンロードが完了/キャンセルされた場合は、残りのダウンロードの通知に対してnullを返します。DownloadManager.EXTRA_DOWNLOAD_ID
_から値を取得することは、このアクションでは機能しません。アクション_Android.intent.action.DOWNLOAD_COMPLETE
_のブロードキャストでIDを取得することは信頼できるようです。追加の_DownloadManager.EXTRA_DOWNLOAD_ID
_から取得する必要があります。ブロードキャストは、ダウンロードが完了した場合だけでなく、ダウンロードをキャンセルしてremove()
を呼び出したときにも送信されることに注意してください。
注:ダウンロードが1つの通知にグループ化されることもあれば、複数の通知が作成されることもあります。通知がグループ化される場合とされない場合の条件を理解できませんでした。 OSのバージョン、デバイス、ダウンロードタイトルなどの多くの要因に依存しているようで、一般的にはかなり予測不可能のようです。
注:他のアプリのダウンロードをキャンセルできるかどうかをテストしましたが、そうではありません。ただし、IDはすべてのアプリで一意のデータベースIDです。 remove()
を呼び出しても、別のアプリのダウンロードはキャンセルされません。