2

我創建了BroadcastReceiver以接收ACTION_DOWNLOAD_COMPLETE,當我的應用程序開始使用DownloadManager下載某些內容時。由於我只在從我的應用程序開始下載時才捕獲ACTION_DOWNLOAD_COMPLETE,因此我使用LocalBroadcastManager當使用LocalBroadcastManager註冊BroadcastReceiver時,onReceive未被調用

但是onReceiver根本不被調用。 DownloadManager應用程序顯示下載已完成,但未觸發onReceive。當我使用registerReceiver它按預期工作。但即使下載是由其他應用程序啓動的,也會通知應用程序。所以需要LocalBroadcastManager。

MainActivity

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     downloadReceiver = new DownloadReceiver(); 

     LocalBroadcastManager.getInstance(this).registerReceiver(downloadReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));   

     downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 
     if(FileHelper.isStorageAvailable()) { 
      DownloadManager.Request request = new DownloadManager.Request(Uri.parse("http://example.com/image.jpg")); 
      downloadManager.enqueue(request); 
     } 
    } 
    @Override 
    protected void onPause() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(downloadReceiver); 
     super.onPause(); 
    } 

DownloadReciever

@Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 

      long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
      downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 

      DownloadManager.Query query = new DownloadManager.Query(); 
      query.setFilterById(downloadId); 
      Cursor c = downloadManager.query(query); 

      if (c.moveToFirst()) { 
       int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS); 
       if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {       
        String title = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE));     
        Toast.makeText(context, title, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
    } 

這根本不叫onRecieve,因爲它應該。指出我在這裏做錯了什麼。現在已經呆在這裏很長一段時間了。我無法使用registerReceiver,因爲只有當我的應用程序開始下載時,我才需要跟蹤下載完成操作。

回答

3

因爲我只想在從我的應用程序啓動下載時捕獲ACTION_DOWNLOAD_COMPLETE,所以我使用了LocalBroadcastManager。

這是行不通的。 DownloadManager在單獨的過程中執行下載,並且它將使用系統廣播。 只有廣播,你可以通過LocalBraodcastManager收到的是廣播通過LocalBroadcastManager

+0

感謝您的快速回復。 :)所以沒有任何方式可以使用DownloadManager,並知道是否從我的應用程序開始下載? – Gimali 2015-03-02 18:10:53

+0

@Gimali:'EXTRA_DOWNLOAD_ID'應該在廣播的'Intent'上,所以你可以看到它是否是你的ID之一。除此之外,只有在需要時才啓用'BroadcastReceiver'。從清單中的android:enabled =「false」開始。在開始下載之前,使用'PackageManager'和'setComponentEnabledSetting()'來啓用它。一旦獲得了廣播,表明下載的分辨率,再次調用'setComponentEnabledSetting()'來禁用它。 – CommonsWare 2015-03-02 18:14:16

+1

謝謝你的指導。閱讀文檔以瞭解更多關於'setComponentEnabledSetting()'部分的內容,因爲我之前沒有使用它。 :) – Gimali 2015-03-02 18:25:16

相關問題