簡體   English   中英

Android:一個 Android 應用程序可以有多個 FirebaseMessagingServices

[英]Android: Can an Android app have multiple FirebaseMessagingServices

我正在構建一個圖書館項目,其中有一個 FirebaseMessagingService。 我的應用程序中也有一個 FirebaseMesagingService。 我看到的是,每當從服務器發送 FCM 時,只有一個 FirebaseMessagingService 處理它。 當我使用 GCM 接收器時情況並非如此。 GCM 接收者都曾經接收過消息,並且根據消息內容,他們會/不會對此做任何事情。

我怎樣才能在 FCM 中實現相同的目標。

您的庫的清單不應包含 FirebaseMessagingService 子類。 將消息服務添加到應用程序的清單應該是集成步驟的一部分,即集成 SDK。 此外,您應該在 SDK 中提供一個鈎子,應用程序可以從中將 FCM 消息有效負載傳遞給 SDK。

本質上,如果應用程序沒有自己的 FirebaseMessagingService 子類,它將在清單中添加您的 SDK 的偵聽器服務,否則它將在其自己的偵聽器服務中添加掛鈎,該服務將有效負載傳遞給您的 SDK,並且 SDK 會執行所需的操作

android 應用不能有多個 FirebaseMessagingService 作為服務而不是接收器。 可以做的是檢查兩個條件:

  1. 如果應用程序在其功能中注冊了 FCMMessagingService,則在庫項目中提供一個方法,該方法可以將消息作為參數,由應用程序的 FCMMessagingService 接收。

  2. 如果應用程序中沒有集成 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”事件。 來自 GCM 的舊事件名稱也用於 Firebase Cloud Messaging。 可以有多個廣播接收器,因此您的庫可以在 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 ,並聲明只有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>

無需在任何AndroidManifest.xml聲明LibraryFirebaseMessagingService

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM