应用前台运行时如何处理到达的Firebase通知并更新当前Activity?
Firebase通知到达时更新当前活跃Activity的实现方案
你当前遇到的无法在FirebaseMessagingService中直接获取顶层Activity实例的问题是Android组件生命周期隔离的正常现象,可通过以下三种常用方案实现需求:
方案1:使用本地广播(无需引入第三方依赖,实现简单)
- 首先在需要响应通知更新的Activity的
onResume方法中注册本地广播接收器,onPause方法中注销接收器,避免内存泄漏 - 在
FirebaseMessagingService的通知接收回调中,发送携带更新数据的本地广播 - 对应Activity接收到广播后,直接在回调中执行UI更新逻辑即可
注意:仅需要特定Activity响应通知时用该方案最合适,不需要更新的Activity无需注册广播接收器
相关示例代码:
// 1. 自定义广播Action常量 public static final String ACTION_NOTIFICATION_RECEIVED = "com.yourapp.ACTION_NOTIFICATION_RECEIVED"; public static final String EXTRA_NOTIFY_DATA = "notify_data"; // 2. Activity中注册接收器 @Override protected void onResume() { super.onResume(); LocalBroadcastManager.getInstance(this).registerReceiver(notifyReceiver, new IntentFilter(ACTION_NOTIFICATION_RECEIVED)); } @Override protected void onPause() { super.onPause(); LocalBroadcastManager.getInstance(this).unregisterReceiver(notifyReceiver); } private BroadcastReceiver notifyReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 拿到通知数据执行UI更新 String data = intent.getStringExtra(EXTRA_NOTIFY_DATA); updateUI(data); } }; // 3. FirebaseMessagingService中发送广播 @Override public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); Intent intent = new Intent(ACTION_NOTIFICATION_RECEIVED); intent.putExtra(EXTRA_NOTIFY_DATA, remoteMessage.getData().toString()); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); }
方案2:全局记录当前活跃Activity(适用于需要全局获取顶层Activity的场景)
- 自定义Application类,注册
ActivityLifecycleCallbacks回调,维护一个静态变量存储当前处于resumed状态的Activity实例 - 在
FirebaseMessagingService中直接读取这个静态变量,判断不为空且是你需要更新的Activity类型时,调用对应更新方法
注意:使用完毕不要强持有Activity实例,避免内存泄漏,每次onPause时要清空对应引用
方案3:使用EventBus事件总线(适合多组件通信场景较多的项目)
- 项目引入EventBus依赖后,在需要响应的Activity的
onStart方法注册订阅,onStop方法取消订阅 - 在
FirebaseMessagingService收到通知时,post对应的通知事件 - 订阅了对应事件的Activity收到事件后执行更新逻辑即可
内容的提问来源于stack exchange,提问作者Lisette HG
相关产品推荐
相关产品推荐

