我正在构建一个库项目,其中包含一个FirebaseMessagingService。 我的应用程序中也有一个FirebaseMesagingService。 我发现,每当服务器发送FCM时, 只有一个FirebaseMessagingService会处理它。 当我使用GCM接收器时,情况并非如此。 两个GCM接收器都会接收消息,并根据消息内容进行处理或不作任何处理。
我该如何在FCM中实现相同的功能。
我正在构建一个库项目,其中包含一个FirebaseMessagingService。 我的应用程序中也有一个FirebaseMesagingService。 我发现,每当服务器发送FCM时, 只有一个FirebaseMessagingService会处理它。 当我使用GCM接收器时,情况并非如此。 两个GCM接收器都会接收消息,并根据消息内容进行处理或不作任何处理。
我该如何在FCM中实现相同的功能。
FirebaseMessagingService
,而不是 FirebaseListenerService
。在 https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService 上的文档明确建议通过示例清单 xml 来创建该服务的子类。 - Cliabhach安卓应用程序不能有多个FirebaseMessagingService,因为它是一个服务而不是接收器。可以做的是检查两个条件:
如果应用程序在其功能中注册了FCMMessagingService,则在库项目中提供一个方法,该方法可以将由应用程序的FCMMessagingService接收到的消息作为参数。
如果应用程序没有集成FCM功能,则在您的库项目中拥有FCMMessagingService,该服务可以处理服务器发送的fcm。
我几天前也遇到了同样的问题,在我们团队中,我们使用了略微不同的方法来解决这个问题,其中涉及到反射。
通常情况下,我们使用委托类,并通过反射提供上下文。
public class OwnPushService extends FirebaseMessagingService {
private List<FirebaseMessagingService> messagingServices = new ArrayList<>(2);
public GCPushService() {
messagingServices.add(new AirshipFirebaseMessagingService());
messagingServices.add(new TLFirebaseMessagingService());
}
@Override
public void onNewToken(String s) {
delegate(service -> {
injectContext(service);
service.onNewToken(s);
});
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
delegate(service -> {
injectContext(service);
service.onMessageReceived(remoteMessage);
});
}
private void delegate(GCAction1<FirebaseMessagingService> action) {
for (FirebaseMessagingService service : messagingServices) {
action.run(service);
}
}
private void injectContext(FirebaseMessagingService service) {
setField(service, "mBase", this); // util method for recursive field search
}
}
如果您对这种方法感兴趣,我已经在Medium上写了一篇文章,其中详细介绍了这个过程:链接
如果您查看Android Firebase Messaging的源代码,您会发现广播接收器被用于监听“com.google.android.c2dm.intent.RECEIVE”事件。Firebase Cloud Messaging中也使用了GCM的旧事件名称。可以有多个广播接收器,因此您的库可以在android清单中注册其接收器:
<application>
<receiver
android:name="com.mylibrary.FirebaseMessagingReceiver"
android:permission="com.google.android.c2dm.permission.SEND"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</receiver>
</application>
你的库中的广播接收器将接收Firebase云消息:
class FirebaseMessagingReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
}
}
LibraryFirebaseMessagingService
作为您的AppFirebaseMessagingService
的父类,并且只在应用程序的AndroidManifest.xml
文件中声明AppFirebaseMessagingService
。public class LibraryFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
//Your library logic
}
}
现在在你的应用程序中:
public class AppFirebaseMessagingService extends LibraryFirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if(shouldLibraryHandlethis(remoteMessage)) {
super.onMessageReceived(remoteMessage);
} else {
//Your app logic
}
}
}
现在在您的应用程序的AndroidManifest.xml
文件中:
<service
android:name=".AppFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
不需要在任何AndroidManifest.xml
中声明LibraryFirebaseMessagingService