Android:一个 Android 应用可以有多个 FirebaseMessagingService
Android: Can an Android app have multiple FirebaseMessagingServices
我正在构建一个图书馆项目,其中有一个 FirebaseMessagingService。
我的应用程序中也有一个 FirebaseMesagingService。我看到的是,每当从服务器发送 FCM 时,只有一个 FirebaseMessagingService 处理它。当我使用 GCM 接收器时情况并非如此。 GCM 接收方都曾经接收过消息,并且根据消息内容,他们 would/would 没有对此做任何事情。
如何在 FCM 中实现同样的效果。
您的库的清单不应包含 FirebaseMessagingService 子类。将 messa 服务添加到应用程序的清单应该是集成步骤的一部分,集成 SDK。此外,您应该在 SDK 中提供一个挂钩,应用程序可以从中将 FCM 消息负载传递给 SDK。
基本上,如果应用没有自己的 FirebaseMessagingService 子类,它会在清单中添加您的 SDK 的侦听器服务,否则它会在自己的侦听器服务中添加挂钩,将有效负载传递给您的 SDK,然后 SDK 采取所需的操作
android 应用不能将多个 FirebaseMessagingService 作为服务而不是接收器。可以做的是检查两个条件:
如果应用程序在其功能中注册了FCMMessagingService,则在库项目中提供一个方法,该方法可以将消息作为参数,由应用程序的FCMMessagingService接收。
如果应用程序没有集成 FCM 功能,那么在你的库项目中有 FCMMessagingService 可以处理服务器发送的 fcm。
几天前我遇到了同样的问题,在我们的团队中,我们使用了一种稍微不同的方法,它涉及反思。
通常,我们使用委托 class 并通过反射提供上下文。
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 上写了一篇关于这种方法的文章:link
在这种情况下,您应该将 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
我正在构建一个图书馆项目,其中有一个 FirebaseMessagingService。 我的应用程序中也有一个 FirebaseMesagingService。我看到的是,每当从服务器发送 FCM 时,只有一个 FirebaseMessagingService 处理它。当我使用 GCM 接收器时情况并非如此。 GCM 接收方都曾经接收过消息,并且根据消息内容,他们 would/would 没有对此做任何事情。
如何在 FCM 中实现同样的效果。
您的库的清单不应包含 FirebaseMessagingService 子类。将 messa 服务添加到应用程序的清单应该是集成步骤的一部分,集成 SDK。此外,您应该在 SDK 中提供一个挂钩,应用程序可以从中将 FCM 消息负载传递给 SDK。
基本上,如果应用没有自己的 FirebaseMessagingService 子类,它会在清单中添加您的 SDK 的侦听器服务,否则它会在自己的侦听器服务中添加挂钩,将有效负载传递给您的 SDK,然后 SDK 采取所需的操作
android 应用不能将多个 FirebaseMessagingService 作为服务而不是接收器。可以做的是检查两个条件:
如果应用程序在其功能中注册了FCMMessagingService,则在库项目中提供一个方法,该方法可以将消息作为参数,由应用程序的FCMMessagingService接收。
如果应用程序没有集成 FCM 功能,那么在你的库项目中有 FCMMessagingService 可以处理服务器发送的 fcm。
几天前我遇到了同样的问题,在我们的团队中,我们使用了一种稍微不同的方法,它涉及反思。
通常,我们使用委托 class 并通过反射提供上下文。
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 上写了一篇关于这种方法的文章:link
在这种情况下,您应该将 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