使用 LocalBroadcastManager 注册 BroadcastReceiver 时未调用 onReceive
onReceive not being called when BroadcastReceiver is registered using LocalBroadcastManager
我创建了一个 BroadcastReceiver
以在我的应用开始使用 DownloadManager
下载内容时接收 ACTION_DOWNLOAD_COMPLETE
。因为我只想在从我的应用程序开始下载时捕获 ACTION_DOWNLOAD_COMPLETE
,所以我使用了 LocalBroadcastManager
.
但是 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();
}
下载接收者
@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
,因为只有当我的应用程序开始下载时我才需要跟踪下载完成操作。
As I want to capture ACTION_DOWNLOAD_COMPLETE only when downloading is started from my app, I've used LocalBroadcastManager.
那是行不通的。 DownloadManager
在单独的进程中进行下载,并且会使用系统广播。您可以通过 LocalBraodcastManager
接收的 只有 广播是 您通过 LocalBroadcastManager
广播 的广播。
我创建了一个 BroadcastReceiver
以在我的应用开始使用 DownloadManager
下载内容时接收 ACTION_DOWNLOAD_COMPLETE
。因为我只想在从我的应用程序开始下载时捕获 ACTION_DOWNLOAD_COMPLETE
,所以我使用了 LocalBroadcastManager
.
但是 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();
}
下载接收者
@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
,因为只有当我的应用程序开始下载时我才需要跟踪下载完成操作。
As I want to capture ACTION_DOWNLOAD_COMPLETE only when downloading is started from my app, I've used LocalBroadcastManager.
那是行不通的。 DownloadManager
在单独的进程中进行下载,并且会使用系统广播。您可以通过 LocalBraodcastManager
接收的 只有 广播是 您通过 LocalBroadcastManager
广播 的广播。