Android - DownloadManager / BroadcastReceiver called multiple times

I use DownloadManager to process downloads in my application, I would like to notify the user that the download is complete.

I use the following code that works well

public void downloaddownload(View v){ View v2 = (View) v.getParent(); TextView urlView = (TextView) v2.findViewById(R.id.url); String urlString = (String) urlView.getText().toString(); TextView artistView2 = (TextView) v2.findViewById(R.id.artist); final String artistString = (String) artistView2.getText().toString(); TextView titleView2 = (TextView) v2.findViewById(R.id.title); final String titleString = (String) titleView2.getText().toString(); DownloadManager.Request request = new DownloadManager.Request(Uri.parse(urlString)); request.setDescription(titleString); request.setTitle(artistString); // in order for this if to run, you must use the android 3.2 to compile your app if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC + "/folder", titleString + " - " + artistString + ".mp3"); Toast.makeText(mainContext, "Downloading " + titleString + " - " + artistString, Toast.LENGTH_SHORT).show(); // get download service and enqueue file DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(request); onComplete = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Toast.makeText(mainContext, "Download \" " + titleString + " - " + artistString + "\" completed", Toast.LENGTH_LONG).show(); } }; registerReceiver(onComplete, new IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE)); } 

The problem is that the onReceive method is also called for previous downloads.

Say I download a.mp3, b.mp3 and c.mp3 when a.mp3 is completed, I get m.mp3 completed, when b.mp3 is completed, I get .m.mp3 and then a new b.mp3 toast is completed ...

How could I prevent this? thanks.

+6
source share
2 answers

Yo register BroadcastReceiver every time you upload a file. This means that the second time you download the file, you will have two receivers registered. You should probably unregister with unregisterReceiver() after completing work (possibly in onReceive() ).

+9
source
 long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); Query query = new Query(); query.setFilterById(downloadId); Cursor cur = manager.query(query); if (cur.moveToFirst()) { int columnIndex = cur.getColumnIndex(DownloadManager.COLUMN_STATUS); if (DownloadManager.STATUS_SUCCESSFUL == cur.getInt(columnIndex)) { titleString=cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_TITLE));} 

you should use this to get the title bar for individual downloads. because each download has its own id. I know the answer is too late, but it may help others in the future ...

+1
source

All Articles