动态广播接收器:LocalBroadcastManager.registerReceiver vs registerReceiver [英] Dynamic BroadcastReceivers: LocalBroadcastManager.registerReceiver vs registerReceiver

查看:276
本文介绍了动态广播接收器:LocalBroadcastManager.registerReceiver vs registerReceiver的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从具有2个不同接收器的服务接收广播.一个接收者更新是一个视图,因此我将其注册到活动的onResume方法中.

I'm trying to receive broadcasts from a service with 2 different receivers. One receiver update's a view so I register it in the activity's onResume method.

当应用程序不在前台时,我使用其他接收器,以便在后台服务完成时显示系统通知.

When the app is not in the foreground I use the other receiver so I can show a system notification when the background service completes.

下面的代码是我注册接收者的方式:

The code below is how I'm registering my receivers:

@Override
protected void onPause() {
    // unregister local
    unregisterReceiver(localReceiver);

    // register remote
    registerReceiver(remoteReceiver, filter);
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    // remove remote receiver
    // since remote is only registered in onPause it won't be registered during the first onResume call
    // so we want to ignore any exceptions
    try {
        unregisterReceiver(remoteReceiver);
    } catch (IllegalArgumentException e) {
        Log.e(LOG_TAG, "No receiver registered, could be first time");
    }

    // add local receiver
    registerReceiver(localReceiver, filter);
    Log.i(LOG_TAG, "resumed. should be registered");
}

在Activity类的顶部,两个接收者的实例化如下:

The two receiver's are instantiated like this at the top of the Activity class:

BroadcastReceiver localReceiver = new BroadcastReceiver() { ... };

WaitTimeReceiver remoteReceiver = new WaitTimeReceiver();

该服务的意图如下:

broadcastIntent = new Intent(Support.SERVICE_BR);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);

// later on sends using
sendBroadcast(broadcastIntent);

使活动"中的过滤器匹配:

The Filter in the Activity is made to match:

filter.addAction(Support.SERVICE_BR);
filter.addCategory(Intent.CATEGORY_DEFAULT);

上面的所有方法都可以正常工作,暂停恢复功能可以按预期工作,但是我的问题是为什么LocalBroadcastManager不能正常工作?

Everything above is working the pause resume functionality works as expected, but my question is why the LocalBroadcastManager was not?

使用LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this)然后调用lbm.registerReceiver(localReceiver)均未收到我的任何广播.

Using LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this) and then calling lbm.registerReceiver(localReceiver) was not receiving any of my broadcasts for either.

为什么LocalBroadcastManager没有收到我的任何广播?

Why wasn't the LocalBroadcastManager receiving any of my broadcasts?

推荐答案

BroadcastReceiver仅可以接收通过LocalBroadcastManager发送的广播. LocalBroadcastManager接收器无法接收使用ActivityServicesendBroadcast()方法发送的广播.

BroadcastReceivers registered with LocalBroadcastManager can only receive broadcasts sent with LocalBroadcastManager. Broadcasts sent with an Activity's or Service's sendBroadcast() method cannot be received by LocalBroadcastManager Receivers.

请改用LocalBroadcastManager#sendBroadcast()方法.例如:

LocalBroadcastManager.getInstance(this).sendBroadcast(intent)

这篇关于动态广播接收器:LocalBroadcastManager.registerReceiver vs registerReceiver的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆