Android アプリでメッセージを受信する

Firebase Notifications は、受信側アプリがフォアグラウンド状態であるかバックグラウンド状態であるかによって、動作が異なります。フォアグラウンド アプリで通知メッセージまたはデータ メッセージを受信する場合は、onMessageReceived コールバックを処理するコードを記述する必要があります。通知メッセージとデータ メッセージの違いの説明については、メッセージのタイプをご覧ください。

メッセージの処理

メッセージを受信するには、FirebaseMessagingService を拡張したサービスを使用します。このサービスは onMessageReceived コールバックと onDeletedMessages コールバックをオーバーライドする必要があります。メッセージは受信から 10 秒以内に処理されるようにします。10 秒経過すると、Android では実行が保証されず、いつでもプロセスが終了される可能性があります。メッセージの処理にもう少し時間が必要な場合は、Firebase Job Dispatcher を使用してください。

onMessageReceived はほとんどのメッセージ タイプに用意されていますが、次の例外があります。

  • アプリがバックグラウンドで動作しているときに配信された通知メッセージ。この場合、通知は端末のシステムトレイに配信されます。通知をユーザーがタップすると、デフォルトではアプリのランチャーが開きます。

  • 通知とデータ ペイロードの両方を含む、バックグラウンドおよびフォアグラウンドのメッセージ。この場合、通知は端末の通知領域(システムトレイ)に配信され、データ ペイロードはランチャー アクティビティのインテントの追加部分で配信されます。

要約:

アプリの状態 通知 データ ペイロード 両方
フォアグラウンド onMessageReceived onMessageReceived onMessageReceived
バックグラウンド システムトレイ onMessageReceived 通知: システムトレイ
インテントの追加部分にあるデータ
メッセージ タイプについて詳しくは、通知とデータ メッセージをご覧ください。

アプリのマニフェストの編集

FirebaseMessagingService を使用するには、アプリのマニフェストに次の設定を追加する必要があります。

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

通知の外観をカスタマイズするためのデフォルト値を設定することもお勧めします。通知ペイロード内に同等の値が設定されていなかった場合に適用されるカスタム デフォルト アイコンとカスタム デフォルト カラーを指定できます。

カスタム デフォルト アイコンとカスタムカラーを設定するには、次の行を application タグに追加します。

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android には、以下の場合にカスタム デフォルト アイコンが表示されます。

  • Notifications Composer から送信されたすべての通知メッセージ。
  • 通知ペイロード内にアイコンが明示的に設定されていない通知メッセージ。

Android では、以下の場合にカスタム デフォルト カラーが使用されます。

  • Notifications Composer から送信されたすべての通知メッセージ。
  • 通知ペイロード内にカラーが明示的に設定されていない通知メッセージ。

カスタム デフォルト アイコンが設定されず、通知ペイロード内にもアイコンが設定されていない場合は、Android では白色でレンダリングされたアプリケーション アイコンが表示されます。

onMessageReceived のオーバーライド

FirebaseMessagingService.onMessageReceived メソッドをオーバーライドすれば、受信した RemoteMessage オブジェクトに基づいて操作を行い、メッセージ データを取得することができます。

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // ...

    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

onDeletedMessages のオーバーライド

場合によっては、FCM からメッセージが配信されないことがあります。これは、特定の端末が接続されたときにその端末にまだ配信されていないアプリのメッセージが多すぎる(100 件を超えている)場合や、端末が 1 か月以上 FCM に接続されていない場合に起こります。このような場合、FirebaseMessagingService.onDeletedMessages() へのコールバックを受け取ることがあります。アプリ インスタンスがこのコールバックを受け取った場合は、アプリサーバーとの完全な同期を実行する必要があります。過去 4 週間以内にその端末のアプリにメッセージを送信していない場合、onDeletedMessages() は呼び出されません。

バックグラウンド アプリの通知メッセージの処理

アプリがバックグラウンドで動作しているとき、Android ではシステムトレイに通知メッセージが送られます。ユーザーが通知をタップすると、デフォルトでアプリ ランチャーが開きます。

通知とデータ ペイロードの両方を含むメッセージ(および Notifications コンソールから送信されたすべてのメッセージ)がここに含まれます。通知は端末の通知領域(システムトレイ)に配信され、データ ペイロードはランチャー アクティビティのインテントの追加部分で配信されます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。