我創建了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
,因爲只有當我的應用程序開始下載時,我才需要跟蹤下載完成操作。
感謝您的快速回復。 :)所以沒有任何方式可以使用DownloadManager,並知道是否從我的應用程序開始下載? – Gimali 2015-03-02 18:10:53
@Gimali:'EXTRA_DOWNLOAD_ID'應該在廣播的'Intent'上,所以你可以看到它是否是你的ID之一。除此之外,只有在需要時才啓用'BroadcastReceiver'。從清單中的android:enabled =「false」開始。在開始下載之前,使用'PackageManager'和'setComponentEnabledSetting()'來啓用它。一旦獲得了廣播,表明下載的分辨率,再次調用'setComponentEnabledSetting()'來禁用它。 – CommonsWare 2015-03-02 18:14:16
謝謝你的指導。閱讀文檔以瞭解更多關於'setComponentEnabledSetting()'部分的內容,因爲我之前沒有使用它。 :) – Gimali 2015-03-02 18:25:16