onReceive 调用了很多次

Posted

技术标签:

【中文标题】onReceive 调用了很多次【英文标题】:onReceive called many times 【发布时间】:2015-04-06 12:01:58 【问题描述】:

我有一个从其他应用程序获取数据的服务。

当我得到日期时,我会向 broadCast 发送消息以刷新 UI。

onReceive方法被多次调用,数据多次显示。

这是我的代码:

DataService.java

if(sizeLat == 1) 
                                       
   sendMessage("Alerte1;");
                                    

else 

   sendMessage("Alerte2;");



 private void sendMessage(String message) 
    Log.w("","==> send message");
    Intent intent = new Intent("my-event");
    // add data
    intent.putExtra("message", message);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
 

MainActivity.java

// handler for received Intents for the "my-event" event 
    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() 
      @Override
      public void onReceive(Context context, Intent intent) 
          
                      
      Log.e("","Onreceiver");
      String message = intent.getStringExtra("message");
    
        
        if(message.equals("Alerte1"))
      parentItems.add(message);
      adapter.notifyDataSetChanged();
         ;

@Override
  protected void onResume() 
    Log.d(TAG, "On Resume");
    super.onResume();
    
    // Register mMessageReceiver to receive messages.
    
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter("my-event"));

我该如何解决这个问题?

【问题讨论】:

这个问题可能是您的服务检查您的服务是否向您发送了多个数据,或者可能是多次发送数据。进行调试并检查它或打印日志以查看到底发生了什么。 没有服务只发送一次,我确认了 方法 sendmessage() 被调用一次,但 onReceive() 被调用多次 您正在创建私有 BroadcastReceiver mMessageReceiver = new BroadcastReceiver() 的多个实例,将其设为静态或单例以避免这种行为。 在这里回答 - ***.com/a/46563020/7758211 【参考方案1】:

将广播注册行放入 onCreate 并在 onDestroy() 方法中取消注册。您必须从 onResume() 移动到 onCreate 的行是:-

LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter("my-event"));

【讨论】:

永远不要那样做! onDestroy 不保证被系统调用。 @zgulser ***.com/questions/23846352/… 创建广播接收器的实例对我有用。【参考方案2】:

您可能同时存在两个活动实例。在消息接收器上打断点,检查你的活动类实例的地址,看看每次调用 onReceive 时它们是否不同。

可能有两个实例同时存在的原因有几个,但最常见的原因之一是在活动中泄漏上下文。 更多关于这个topic。

【讨论】:

【参考方案3】:

我通过在 onPause 方法中取消注册 BroadcastReceiver 解决了同样的问题

LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver,new IntentFilter("my-event")));

在 OnResume 方法中注册

LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, 新的 IntentFilter("my-event"));

【讨论】:

以上是关于onReceive 调用了很多次的主要内容,如果未能解决你的问题,请参考以下文章

关闭 wifi 会导致两次调用 onReceive()

android广播接收器中未调用onReceive()进行静态广播

BroadcastReceiver onReceive方法没有被调用?

CAsyncSocket::OnReceive 未在 DLL 中调用

当 ObservedObject 更改时,在 SwiftUI 视图中未调用 onReceive

CSocket::OnReceive 同时调用