Android:Android应用可以有多个FirebaseMessagingServices

时间:2017-12-05 17:33:49

标签: android firebase google-cloud-messaging firebase-cloud-messaging

我正在构建一个库项目,我有一个FirebaseMessagingService。 我的应用中也有FirebaseMesagingService。我看到的是,每当从服务器发送FCM时,只有一个FirebaseMessagingService处理它。当我使用GCM接收器时,情况并非如此。两个GCM接收器都用于接收消息,并且基于消息内容,他们会/不会对此做任何事情。

如何在FCM中实现相同目标。

4 个答案:

答案 0 :(得分:5)

您的图书馆清单不应包含FirebaseMessagingService子类。将messa服务添加到应用程序的清单应该是集成步骤的一部分,集成SDK。此外,您应该在SDK中提供一个钩子,应用程序可以将FCM消息有效负载传递给SDK。

基本上,如果应用程序没有自己的FirebaseMessagingService子类,它会在清单中添加SDK的侦听器服务,否则它会在自己的侦听器服务中添加钩子,该服务将有效负载传递给SDK,SDK采取必要的操作

答案 1 :(得分:2)

Android应用程序不能将多个FirebaseMessagingService作为其服务而不是接收者。可以做的是检查两个条件:

  1. 如果app在其功能中注册了FCMMessagingService,则在库项目中提供一个方法,该方法可以将消息作为参数,由app的FCMMessagingService接收。

  2. 如果应用程序中没有集成FCM功能,则在库项目中安装FCMMessagingService,它可以处理服务器发送的fcm。

答案 2 :(得分:0)

几天前我遇到了同样的问题,在我们的团队中,我们使用了一种略有不同的方法,涉及反思。

通常,我们使用委托类并通过反射提供上下文。

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

答案 3 :(得分:0)

在这种情况下,应将LibraryFirebaseMessagingService作为AppFirebaseMessagingService的父项,并在应用程序的AppFirebaseMessagingService文件中仅声明AndroidManifest.xml

例如:

在您的图书馆中:

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>

无需在任何LibraryFirebaseMessagingService中声明AndroidManifest.xml