Android Firebase 消息传递:如何从 onMessageReceived() 更新 UI
Android Firebase Messaging: How Update UI from onMessageReceived()
我已经在我的应用程序中成功实现了 Firebase 消息传递。在后台运行良好,当应用程序位于前台时会调用 onMessageReceived()(yippee!)。
我遇到的问题是我需要动态更新 UI 并且我一直在寻找实现此目的的最佳方法。我不想向用户发送应用内通知(如示例代码所示),我不确定是否要发送广播,我只想访问 MainActivity 以调用方法已经存在,但是我没有引用服务中的 MainActivity。
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getNotification().getBody() != null) {
Log.d(LOG_TAG, "Message received: " + remoteMessage.getNotification().getBody());
} else {
Log.d(LOG_TAG, "Message received: " + remoteMessage.getData().get("message"));
}
// Call method in MainActivity
// <<< What goes Here?>>>>
}
这似乎是一个简单的用例,但我在网上找不到任何帮助。
提前致谢
我认为您应该发送带有数据的本地广播,并在您希望使用该数据的任何地方注册一个接收器。这是一个非常好的设计模式(观察者),因为它将您的 Activity 与服务分离。
如果 activity 想要对数据做某事,它就会做,否则就不会。它们都是独立的实体,据我所知,将来维护此代码会容易得多。
希望对您有所帮助。
是的,您可以更新 UI 并将值传递给您的 activity,方法是使用 本地广播
在您的 onMessageReceived() Firebase 服务中。
broadcaster = LocalBroadcastManager.getInstance(getBaseContext());
Intent intent = new Intent(REQUEST_ACCEPT);
intent.putExtra("Key", value);
intent.putExtra("key", value);
broadcaster.sendBroadcast(intent);
并在您的 Activity 或片段方法中注册本地广播
@Override
public void onStart() {
super.onStart();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver((receiver),
new IntentFilter(PushNotificationService.REQUEST_ACCEPT)
);
}
@Override
public void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(receiver);
}
并像这样处理你的更新事件,做你的更新 UI 在这里,它会在收到通知和 onMessageReceived() 发送广播时自动调用。
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
String value= intent.getStringExtra("key");
String value= intent.getStringExtra("key");
} catch (Exception e) {
e.printStackTrace();
}
}
};
我已经在我的应用程序中成功实现了 Firebase 消息传递。在后台运行良好,当应用程序位于前台时会调用 onMessageReceived()(yippee!)。
我遇到的问题是我需要动态更新 UI 并且我一直在寻找实现此目的的最佳方法。我不想向用户发送应用内通知(如示例代码所示),我不确定是否要发送广播,我只想访问 MainActivity 以调用方法已经存在,但是我没有引用服务中的 MainActivity。
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getNotification().getBody() != null) {
Log.d(LOG_TAG, "Message received: " + remoteMessage.getNotification().getBody());
} else {
Log.d(LOG_TAG, "Message received: " + remoteMessage.getData().get("message"));
}
// Call method in MainActivity
// <<< What goes Here?>>>>
}
这似乎是一个简单的用例,但我在网上找不到任何帮助。
提前致谢
我认为您应该发送带有数据的本地广播,并在您希望使用该数据的任何地方注册一个接收器。这是一个非常好的设计模式(观察者),因为它将您的 Activity 与服务分离。
如果 activity 想要对数据做某事,它就会做,否则就不会。它们都是独立的实体,据我所知,将来维护此代码会容易得多。
希望对您有所帮助。
是的,您可以更新 UI 并将值传递给您的 activity,方法是使用 本地广播
在您的 onMessageReceived() Firebase 服务中。
broadcaster = LocalBroadcastManager.getInstance(getBaseContext());
Intent intent = new Intent(REQUEST_ACCEPT);
intent.putExtra("Key", value);
intent.putExtra("key", value);
broadcaster.sendBroadcast(intent);
并在您的 Activity 或片段方法中注册本地广播
@Override
public void onStart() {
super.onStart();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver((receiver),
new IntentFilter(PushNotificationService.REQUEST_ACCEPT)
);
}
@Override
public void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(receiver);
}
并像这样处理你的更新事件,做你的更新 UI 在这里,它会在收到通知和 onMessageReceived() 发送广播时自动调用。
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
String value= intent.getStringExtra("key");
String value= intent.getStringExtra("key");
} catch (Exception e) {
e.printStackTrace();
}
}
};