【问题标题】:How to create event listener when message from firebase received in android?在android中收到来自firebase的消息时如何创建事件监听器?
【发布时间】:2019-08-14 04:31:13
【问题描述】:

我正在使用 firebase 接收消息。收到消息时 (onMessageReceived())。我想检查消息是否包含必需的字符串(比如“hello”)。如果是,我希望它被另一个片段知道,以便片段中的某些方法将基于消息被调用。

为此,我想在收到消息时创建事件侦听器。 在我的片段中,将调用两个 API。 on API 将被调用 onCreatedView()。 根据来自 firebase 的消息,应该调用第二个 API。 这两个 API 调用应在几分之一毫秒内完成。

MyFireBaseMessage.java

public class MyMessagingService extends FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    Log.d("message here","message here "+ remoteMessage.getData().toString());
    String value = remoteMessage.getData().get("msg");
    Log.d("value here","value here"+" "+value);
    if (value.equalsIgnoreCase("hello"))
    {
        //implement custom event listener here
    }
}
}

【问题讨论】:

  • 您在哪里实现了 FirebaseListener.. 发布您的代码。如果不知道您是如何编码的,就很难提供帮助。请仅发布相关代码。
  • @SahilManchanda - 我已经编辑了我的问题并发布了 firebase 消息类。希望你能理解。如果您需要任何进一步的信息,请告诉我。
  • 请查看我的回答,应该可以解决您的问题。

标签: java android firebase event-listener eventhandler


【解决方案1】:

我现在能想到的一种方法是使用 LocalBroadcast。这样做

  1. 修改您的 Firebase 服务并放置此内容

    public class MyMessagingService extends FirebaseMessagingService {
    private LocalBroadcastManager broadcaster;
    
    @Override
    public void onCreate() {
        broadcaster = LocalBroadcastManager.getInstance(this);
    }
    
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Log.d("message here", "message here " + remoteMessage.getData().toString());
        String value = remoteMessage.getData().get("msg");
        Log.d("value here", "value here" + " " + value);
        if (value.equalsIgnoreCase("hello")) {
            Intent intent = new Intent("custom-listener");
            broadcaster.sendBroadcast(intent)
        }
    }
    

    }

  2. 在您的片段类中进行更改

公共类 BlankFragment 扩展片段 {

    Context context;
    BroadcastReceiver br;

    public BlankFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }

    @Override
    public void onResume() {
        super.onResume();
        setup();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        LocalBroadcastManager.getInstance(context).unregisterReceiver(mMessageReceiver);
    }

    private void setup() {
        LocalBroadcastManager.getInstance(context).registerReceiver(mMessageReceiver,
                new IntentFilter("custom-listener"));
    }


    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Get extra data included in the Intent
            String message = intent.getStringExtra("message");
            Log.d("receiver", "Got message: " + message);
        }
    };

}

通过广播,您将能够收听您想收听的事件。当您的 if 条件为真即value.equalsIgnoreCase("hello")

时,Fragment 类中的 onReceive 方法将被触发

对此答案的格式表示歉意。难以调整。

【讨论】:

  • Sahil Manchanda - 似乎从未使用过 send() 方法。另外,send() 中的“自定义事件名称”是什么。
  • @Eswar 我使用 send 方法来测试广播。这不是必需的。并且“custom-event-name”应该是自定义监听器
  • Sahil Manchanda - 非常感谢您的帮助。它按预期工作。我也忙着做一些改变。抱歉回复延迟。
  • @Eswar np,很高兴它成功了。请接受并投票给答案。谢谢
【解决方案2】:

请试试这个,如果 hello 是消息格式的关键

if (remoteMessage.getData().containsKey("hello")) {
}

或者如果 hello 是消息字符串,那么试试这个

Map<String, String> params = remoteMessage.getData();
JSONObject fullObject = new JSONObject(params);
String messageString = fullObject.getString("msg");

希望它有效!

【讨论】:

    【解决方案3】:

    为此,请在您的应用中使用本地广播接收器

    示例:

    在通知屏幕中像这样使用接收器 @Override

    public void onMessageReceived(RemoteMessage remoteMessage) 
    
    {
    super.onMessageReceived(remoteMessage);
    Log.d("message here", "message here " + remoteMessage.getData().toString());
    String value = remoteMessage.getData().get("msg");
    Log.d("value here", "value here" + " " + value);
    if (value.equalsIgnoreCase("hello")) 
    {
        Intent intent = new Intent("custom-listener");
        broadcaster.sendBroadcast(intent)
    }
    }
    and in fragment register broadcast receiver in onResume method  like this
    
     getActivity().registerReceiver(broadcastReceiver, new IntentFilter("custom-listener"));
    

    同时在 onPause 网络中取消注册接收器

           getActivity().unregisterReceiver(broadcastReceiver);
    

    并在片段中创建广播接收器方法,您可以在其中调用 api ,像这样

     private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() 
    {
        @Override
        public void onReceive(Context context, Intent intent) 
    
    
    };
    

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 2023-01-30
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多