广播收到两次

时间:2012-09-16 16:03:59

标签: android service broadcastreceiver

我正在使用本地广播让我的服务知道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;
}

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

5 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分: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 !!");
 }
}

检查documentation。它说你可能会收到虚假的电话。因此,请务必检查行动

  

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

答案 2 :(得分:1)

确保在任何组件(BroadcastReceiver 等...)的 onCreate 方法中注册 Activity, Fragment, Service 而不是 onResumeonViewCreated(如果是片段网)

例如

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)

答案 3 :(得分:0)

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

  LocalBroadcastManager.getInstance(this).registerReceiver(mLocalReceiver,intentFilterNews);
  LocalBroadcastManager.getInstance(this).registerReceiver(mLocalReceiver,intentFilterWeather);

答案 4 :(得分:0)

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