服务发送的本地广播未被活动接收

13

我有一个Activity,我正在其中本地注册一个BroadcastReceiver,如下所示:

public class SomeActivity extends Activity{

    public static final String PERFORM_SOME_ACTION = "PERFORM_SOME_ACTION";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.some_activity_layout);

        .....
        .....

        IntentFilter filter = new IntentFilter();
        filter.addAction(PERFORM_SOME_ACTION);

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // perform some action ...
            }
        };

        registerReceiver(receiver, filter);
    }

    .....
    .....
}

我有一个Service,我通过以下方式发送一个Intent:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {        

    Intent i = new Intent(SomeActivity.PERFORM_SOME_ACTION);
    sendBroadcast(i);   /* Send global broadcast. */

    return START_STICKY;
}

这个可以正常工作。在实施后,我意识到对于这种情况,本地广播可能更合适:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {        

    Intent i = new Intent(SomeActivity.PERFORM_SOME_ACTION);
    LocalBroadcastManager.getInstance(this).sendBroadcast(i);   /* Send local broadcast. */

    return START_STICKY;
}

不幸的是,上述方案无法正常工作。每次都会发送全局广播,而似乎从未发送/接收本地广播。

我在这里漏掉了什么?难道本地广播不能在两个不同的应用组件之间发送,比如两个单独的 Activity 或从 Service 发送到 Activity 吗?我做错了什么?

注意:

根据文档,每当我们不需要广播传播到应用程序之外时,发送本地广播(范围限制为应用程序自身组件的 应用内部 广播)比发送全局广播(传输到手机上的每个应用程序的 应用间 广播)更有效率且更加精确。这就是进行上述更改的原因。


4
除ن؛†LocalBroadcastManager.getInstance(this).sendBroadcast(i);ن¹‹ه¤–,و‚¨è؟ک需è¦پن½؟用LocalBroadcastManager.getInstance(this).registerReceiver();م€‚ - Shaishav
1
@Shaishav:这个方法可行。你可以将它发布为答案;我会将其标记为正确的(你是第一个)。但是,我是否缺少某些概念?因此,本地广播只能由本地注册的“BroadcastReceiver”接收到吗? - Yash Sampat
1
我和楼主遇到了同样的问题 - 因为我在广播意图上调用了 setData(myUri)。此外,值得检查一下您正在使用的上下文对象来注册接收器/发送广播意图。 - ban-geoengineering
@ban-geoengineering:您能详细说明一下最后一句话的意思吗?您是指如果使用活动上下文来注册接收器,但使用应用程序上下文来发送广播,则接收器可能无法接收到广播吗? - LarsH
1
@LarsH 是的,那就是我想说的。我不确定是否可能是这种情况,但在发现 setData(myUri) 实际上是我的问题之前,这是我考虑的可能性之一 - 所以我没有进一步探索这个想法。但你应该能够通过在两侧使用 getApplicationContext()(或其他)轻松检查。 (我只是想提出来,以防有可能帮助其他人。) - ban-geoengineering
显示剩余2条评论
1个回答

22

我在这里缺少什么?

使用LocalBroadcastManager来注册本地广播,目前正在使用ActivityregisterReceiver方法来注册全局广播:

LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);

2
谢谢您,但请解释一下为什么本地广播只能由本地注册的“BroadcastReceiver”接收。 - Yash Sampat
@Y.S.: BroadcastReceiver registered locally 是什么意思?在您发布的代码中,您遇到了问题,因为您正在使用LocalBroadcastManager发送广播,但是PERFORM_SOME_ACTION操作是使用Activity的registerReceiver方法注册为全局广播。 - ρяσѕρєя K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接