You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android应用的TextView中显示Firebase Cloud Messaging接收的消息?

Hey there! I see you’ve got FCM up and running and can successfully receive messages—great job so far! Now you just need to get that incoming message displayed in a TextView, right?

The key thing to keep in mind here is that you can’t directly update UI components from a Service (like your FcmMessagingService). Services run in the background, separate from your app’s UI thread, so we need a way to pass the message from the service to your activity where the TextView lives. Let’s walk through two reliable approaches to make this happen:

方法1:使用LocalBroadcastManager(简单快速)

This is a straightforward approach for basic use cases, perfect if you want a quick win.

Step 1: Send a broadcast from your FCM Service

Update your onMessageReceived method to send the received message via a local broadcast:

public class FcmMessagingService extends FirebaseMessagingService { 
    private static final String TAG = "MyFirebaseMsgService"; 
    // Define a unique action to identify our broadcast
    public static final String FCM_MESSAGE_ACTION = "com.yourpackage.fcm.MESSAGE_RECEIVED";
    public static final String FCM_MESSAGE_EXTRA = "message_content";

    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
        super.onMessageReceived(remoteMessage); 
        Map<String, String> data = remoteMessage.getData(); 
        
        // Fetch your message content (adjust based on your FCM payload)
        String messageContent = data.get("your_message_key"); // Replace with your actual data key
        // If using notification messages instead of data messages:
        // String messageContent = remoteMessage.getNotification().getBody();

        // Send the message via local broadcast
        Intent intent = new Intent(FCM_MESSAGE_ACTION);
        intent.putExtra(FCM_MESSAGE_EXTRA, messageContent);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    } 
}

Step 2: Receive the broadcast in your Activity and update the TextView

In the Activity that contains your TextView, register a broadcast receiver to catch the message and update the UI:

public class MainActivity extends AppCompatActivity {
    private TextView fcmMessageTextView;
    private BroadcastReceiver fcmMessageReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fcmMessageTextView = findViewById(R.id.your_textview_id); // Replace with your TextView's ID

        // Initialize the broadcast receiver
        fcmMessageReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String message = intent.getStringExtra(FcmMessagingService.FCM_MESSAGE_EXTRA);
                // Update the TextView (broadcast receivers run on the main thread by default, so this is safe)
                if (message != null) {
                    fcmMessageTextView.setText(message);
                }
            }
        };

        // Register the receiver with our unique action
        LocalBroadcastManager.getInstance(this)
                .registerReceiver(fcmMessageReceiver, new IntentFilter(FcmMessagingService.FCM_MESSAGE_ACTION));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Always unregister receivers to avoid memory leaks
        LocalBroadcastManager.getInstance(this)
                .unregisterReceiver(fcmMessageReceiver);
    }
}

方法2:使用ViewModel + LiveData(Modern Android Architecture Recommended)

This approach follows MVVM principles, is more maintainable, and avoids common pitfalls like memory leaks associated with broadcasts.

Step 1: Create a ViewModel to hold the message

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class FcmMessageViewModel extends ViewModel {
    private final MutableLiveData<String> _receivedMessage = new MutableLiveData<>();
    public LiveData<String> receivedMessage = _receivedMessage;

    public void setReceivedMessage(String message) {
        _receivedMessage.postValue(message); // postValue ensures update happens on main thread
    }
}

Step 2: Update the ViewModel from your FCM Service

public class FcmMessagingService extends FirebaseMessagingService { 
    private static final String TAG = "MyFirebaseMsgService"; 

    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
        super.onMessageReceived(remoteMessage); 
        Map<String, String> data = remoteMessage.getData(); 
        String messageContent = data.get("your_message_key"); 
        // Or use notification body if needed: remoteMessage.getNotification().getBody();

        // Get the ViewModel and update the message
        FcmMessageViewModel viewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication())
                .create(FcmMessageViewModel.class);
        viewModel.setReceivedMessage(messageContent);
    } 
}

Step 3: Observe the ViewData in your Activity

public class MainActivity extends AppCompatActivity {
    private TextView fcmMessageTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fcmMessageTextView = findViewById(R.id.your_textview_id);

        // Get the ViewModel instance
        FcmMessageViewModel viewModel = new ViewModelProvider(this).get(FcmMessageViewModel.class);
        
        // Observe the LiveData: update TextView whenever the message changes
        viewModel.receivedMessage.observe(this, message -> {
            if (message != null) {
                fcmMessageTextView.setText(message);
            }
        });
    }
}

Quick Notes to Keep in Mind

  • Replace your_textview_id and your_message_key with your actual TextView ID and the key used in your FCM payload.
  • If your app is in the background and you’re using notification messages, you’ll also need to handle the notification tap to pass the message to your activity (you can add extra data to the notification intent in onMessageReceived).
  • Ensure your FcmMessagingService is registered in your AndroidManifest.xml:
    <service
        android:name=".FcmMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    

内容的提问来源于stack exchange,提问作者Asmaa Mohamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:38:11