16

我正在使用本地广播让我的服务知道 AsyncTask 已完成其工作,但我有一个小问题:广播仅发送一次(它由仅在应用程序启动时调用的函数创建)但我收到两次。

简化代码:

@Override
protected void onPostExecute(HttpResponse result) {
    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(getBaseContext());
    localBroadcastManager.sendBroadcast(new Intent(getString(R.string.bc_CONNECTED)));
}

在服务中:

private BroadcastReceiver connectedBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(getString(R.string.app_tag), "broadcast received !!");
    }
};

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    LocalBroadcastManager.getInstance(this).registerReceiver(connectedBroadcastReceiver, new IntentFilter(getString(R.string.bc_CONNECTED)));
    return START_STICKY;
}

有没有人遇到过这种奇怪的行为?

4

5 回答 5

26

我有同样的问题,问题是我在 onCreate 方法和 onResume 方法中注册了接收器。从 onCreate 中删除问题已解决。

于 2013-03-01T18:54:02.913 回答
12

在响应广播之前,您应该始终检查意图操作。

public void onReceive(Context context, Intent intent){
      if(intent.getAction() != null && intent.getAction().equals(getString(R.string.bc_CONNECTED))){
      Log.d(getString(R.string.app_tag), "broadcast received !!");
 }
}

检查文档。它说您可能会收到虚假电话。所以总是检查行动

registerReceiver(BroadcastReceiver, IntentFilter) 和应用程序清单中使用的 Intent 过滤器不保证是独占的。它们是操作系统有关如何找到合适收件人的提示。发件人可以绕过过滤器解析,强制发送给特定收件人。因此,onReceive() 实现应该只响应已知操作,忽略它们可能收到的任何意外 Intent。

于 2012-09-16T18:42:17.420 回答
1

我遇到了这个问题,因为我注册了两次,因为我有两个意图过滤器。所以系统两次传递了相同的意图。

  LocalBroadcastManager.getInstance(this).registerReceiver(mLocalReceiver,intentFilterNews);
  LocalBroadcastManager.getInstance(this).registerReceiver(mLocalReceiver,intentFilterWeather);
于 2016-09-08T06:57:01.600 回答
1

退出应用程序时是否取消注册接收器?否则,您会在每个应用程序中启动另一个注册的接收器。或者,您必须在注册之前检查接收方是否已经在之前的应用调用中注册过。

于 2017-04-11T13:41:26.637 回答
1

确保在任何组件(等...)BroadcastReceiver的方法中注册,而不是或(在 Fragmnet 的情况下)onCreateActivity, Fragment, ServiceonResumeonViewCreated

例如

val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("TAGGg",intent?.getBooleanExtra("ext", false).toString())
    }
}

// On Create method of component
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    LocalBroadcastManager.getInstance(requireActivity()).registerReceiver(receiver, IntentFilter("test-event"))
}

还要确保取消注册接收器onStop()onDestroy()

LocalBroadcastManager.getInstance(requireActivity()).unregisterReceiver(receiver)
于 2021-07-06T06:42:14.820 回答