6

我正在使用DownloadManager处理我的应用程序中的下载,我想在下载完成时通知用户。Android - DownloadManager/BroadcastReceiver多次调用

我使用的是如下因素代码工作良好

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)); 


    } 

的问题是的onReceive方法被调用以前下载过。

假设我下载a.mp3,b.mp3和c.mp3,当a.mp3完成时我收到a.mp3完成,当b.mp3完成时我收到a.mp3完成,然后一个新的吐司b.mp3完成...

我怎么能阻止呢?谢谢。

+0

下载管理器也有问题。另请参见http://stackoverflow.com/questions/10852821/downloadmanager-sends-status-successful-for-failed-download –

+0

在您的BroadcastReceiver onReceive方法你需要注册像Activity.this.unregister(这个) – Gugelhupf

回答

9

呦注册BroadcastReceiver每次你下载一个文件。这意味着,您第二次下载文件时,您将注册两个接收器。工作完成后,您应该使用unregisterReceiver()取消注册(可能在onReceive())。

+0

我也有也是问题。 TNX – RedFlow

1
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));} 

你应该使用它来获得你的标题字符串的个人下载。因为每个下载都有自己的ID。我知道答案太晚了,但它可能有助于未来的其他人...