web-dev-qa-db-ja.com

Android FCMによる通知-FirebaseMessagingServiceを開始したのは誰ですか?

セットアップガイド here に従って、サンプルアプリでA)extends firebase servicesクラスというクラスを作成しました。 B)これらのクラスをAndroidManifest.xmlに入れました

A)Javaクラス

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //a) What's the life cycle of the service? How can I ensure this method is getting called?
        //b) If the service is killed at some point, will system restart it on receiving new messages?
        Log.d(TAG, "From: " + remoteMessage.getFrom());
    }
}

B)AndroidManifest.xml

<service
    Android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

その後、アプリはFCMから通知を受信できます。

これが私の質問です:

  1. 誰がFirebaseMessagingService通知サービスを開始しましたか? startService()を呼び出す場所が必要ですよね。

  2. 私の理解では、ダウンストリーム通知は、アプリの状態に関係なく、モバイルデバイスのGoogle Playサービスに配信されます。次に、appまたはserviceswipe closed/killed/force stopのときにonMessageReceive()が確実に呼び出されるようにするにはどうすればよいですか?関連する行動はどこかに文書化されていますか?

編集:

  1. 次のような場合が気になります。 data messageについて話しましょう。 (notification messageと比較)。GooglePlayサービスが実行されていてシステムトレイに送信しているため、クライアントアプリがFCMメッセージを受信し、デフォルトの通知を表示します。しかし、MyFirebaseMessagingServiceはシステムによって強制終了され、再起動されないため、私のonMessageReceive()は呼び出されません。出来ますか?
14
Weishi Zeng

1。誰がFirebaseMessagingService通知サービスを開始しましたか? startService()を呼び出す場所が必要ですよね?

SDKがこれを自動的に行います。

2。私の理解では、ダウンストリーム通知は、アプリの状態に関係なく、モバイルデバイスのGoogle Playサービスに配信されます。次に、appまたはserviceswipe closed/killed/force stopのときにonMessageReceive()が確実に呼び出されるようにするにはどうすればよいですか?関連する動作はどこかに文書化されていますか?

Androidはこちら の受信メッセージの公式ドキュメントです。メッセージの動作について説明しています(使用するメッセージペイロードのタイプによって異なります(つまり、notificationまたはdata))アプリがフォアグラウンドとバックグラウンドにある場合。

onMessageReceived()で)メッセージを自分で処理できるようにするには、data-onlyメッセージペイロードを送信する必要があります。

swipe closed/killed/force stopsに関するトピックについては、このトピックはかなり前から議論されており、明確な答えはないようです。テストの1つで、まだメッセージを受信するdata-onlyメッセージペイロードでテスト済み)が可能です。私の場合スワイプして閉じるアプリ。ただし、[設定]メニューから強制終了すると、メッセージを受信できませんでした。これはnotが常に動作することに注意してください。

swipe closeアプリを実行すると、force stopと同じになるように設計されたデバイスがいくつかあります/それら(私の答えをご覧ください ここ )。

アプリがforce-closedでなくても、アプリが単にswiped awayであっても、デバイスもあります、デバイス自体がメッセージの受信を妨げています。他の人は、WhatsAppのようなアプリがそれを行うことができたので、これは事実ではあり得ないと言います。私がこれまでに学んだ理由は、デバイスメーカーがwhitelistedそれを可能にするための有名なアプリのほとんどを持っているためです。

だから、あなたの質問に答えるためだけに、いいえ。これはどこにも文書化されていません(IMO)これはデバイスにも依存するトピックであり、FCMにはtotal controlがないためです。

3。次のような場合が気になります。データメッセージについて話しましょう。 (通知メッセージと比較)。GooglePlayサービスが実行されていてシステムトレイに送信しているため、クライアントアプリはFCMメッセージを受信し、デフォルトの通知を表示します。ただし、MyFirebaseMessagingServiceはシステムによって強制終了され、再起動されないため、onMessageReceive()は呼び出されません。出来ますか?

申し訳ありませんが、FirebaseMessagingServiceは、Google Playサービスがアクティブである限り、Google Playサービスとのtiedであり、Firebaseサービスも同様です。私の一部 ここで回答

ただし、以前にFirebaseMessagingServiceについて言及されていたことがわかりました(これを参照 post 、@ ArthurThompsonのコメント):

これらのサービスは、常にデバイスで実行されているGoogle Playサービスによって開始されます。これらのサービスを自分で開始/停止する必要はありません。

12
AL.